我有一個datamapper模型,它在名爲property的屬性上具有唯一索引。我想在名稱尚不存在時創建新記錄,並默默地忽略嘗試創建具有重複名稱的記錄。在datamapper中做這件事的「正確」方法是什麼?我想出了如何忽略使用數據映射器的重複插入
1
A
回答
1
我認爲最好的答案是first_or_create使用,這成丹上面所指出的,已建成的DataMapper,因此不需要申報。
require 'dm-core'
require 'dm-validations'
class Committer
include DataMapper::Resource
property :id, Serial
property :name, String, :unique_index => true
validates_present :name
validates_is_unique :name
end
committer = "George"
record = Committer.first_or_create(:name => committer)
0
一種解決方案是簡單地忽略異常:
begin
Committer.create!(:name => committer)
rescue DataObjects::IntegrityError => e # ignore duplicate inserts
end
如果你有這樣做的更好(更地道)的方式,請讓我知道。
1
最好的方法是使用DM-驗證的寶石,並確保指定的name屬性作爲唯一的,例如:
class Committer
include DataMapper::Resource
# ... other properties ...
property :name, String, :length => 1..100, :required => true, :unique => true
end
的DM-驗證創業板將反思你的模型,並自動設置驗證爲您的物業。在這種情況下,它不允許多個提交者具有相同的名稱。
0
這裏是另一個解決方案,我想出了:
require 'dm-core'
require 'dm-validations'
require 'dm-more'
record = Committer.find_or_create(:name => committer)
如果你在西納特拉用這個,需要DM-更多的似乎會導致其他 問題。我的解決辦法是要求我自己的文件,只有 包含以下代碼:
module DataMapper
module Model
def first_or_create(conditions = {}, attributes = {})
first(conditions) || create(conditions.merge(attributes))
end
alias find_or_create first_or_create
end
end
相關問題
- 1. 忽略映射忽略
- 2. MySQL - 當兩個唯一列重複輸入時,忽略插入到映射
- 3. 休眠 - 如何忽略未映射的字段,而插入
- 4. MySQL的外鍵重複插入忽略
- 5. 如何在使用重寫映射時忽略.aspx擴展名?
- 6. 寫入數據並忽略重複項。
- 7. Knockout.js映射忽略
- 8. 在查詢數據庫時讓數據映射器忽略'type'
- 9. RSQLite插入忽略跳過重複
- 10. 跳過/忽略/不插入重複行
- 11. MongoDB批量插入忽略重複
- 12. Mongojs:忽略重複對象插入
- 13. Oracle'插入所有'忽略重複
- 14. INSERT或忽略插入重複語句
- 15. 插入重複鍵哈希映射
- 16. 如何忽略重複使用鍵碼?
- 17. 流利NHibernation唯一的字符串映射(忽略重複)
- 18. 如何忽略lazy =「false」映射?
- 19. 如何忽略映射的代碼使用代碼映射「約定」
- 20. Knockout映射插件:使用AJAX重新載入數據
- 21. 使用knexjs插入忽略
- 22. 如何忽略控制器重複值
- 23. Automapper - 忽略條件映射
- 24. RestKit 0.20忽略putObject:映射
- 25. Automapper - 映射時忽略
- 26. 忽略數據庫中的重複行
- 27. 插入忽略未能防止重複插入
- 28. 發送映射器在映射時忽略成員
- 29. 忽略使用自動映射器的二級兒童
- 30. 我如何忽略NHibernate中的映射屬性設置器
謝謝丹。我主要關心的不是如何執行唯一性,而是如何執行INSERT IGNORE - 即如何創建新記錄,但是如果重複記錄已經存在,將自動失敗。我想知道做這件事的最好方法是什麼。 – cayblood 2010-02-26 06:09:13
不能在沒有插件的情況下在DataMapper中執行INSERT IGNORE,但是沒有一個可以執行此atm。 – dkubb 2010-02-26 18:57:36
只是爲了澄清,我並不是故意特意要求使用INSERT IGNORE。任何完成我目標的事情都很好。 – cayblood 2010-02-27 21:11:04