我有一個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. 如何在使用重寫映射時忽略.aspx擴展名?
- 2. 在查詢數據庫時讓數據映射器忽略'type'
- 3. MongoDB批量插入忽略重複
- 4. 如何忽略重複使用鍵碼?
- 5. 如何忽略lazy =「false」映射?
- 6. Knockout映射插件:使用AJAX重新載入數據
- 7. 如何忽略控制器重複值
- 8. Automapper - 映射時忽略
- 9. RestKit 0.20忽略putObject:映射
- 10. 我如何忽略NHibernate中的映射屬性設置器
- 11. 總結數據框忽略重複
- 12. 如何使用for-each忽略數組中的重複值?
- 13. Jackson對象映射器如何忽略JsonProperty註釋?
- 14. 如何獲取「插入忽略stament」中插入行的數量
- 15. 導入數據並忽略SQL Server中的重複項
- 16. 如何忽略列中不包含數據的重複行
- 17. 如何忽略數據庫查詢中重複的順序值
- 18. 提卡Solr的元數據映射忽略文檔標題
- 19. 無法使用映射插件映射數據?敲擊
- 20. 如何避免重複數據插入?
- 21. 數據未插入多對多映射?
- 22. 忽略從DomainModel到ViewModel的映射
- 23. Automapper V5忽略映射的性質
- 24. 映射到JSON - 忽略特定的鍵
- 25. 重複鍵忽略?
- 26. Jooq - 忽略重複
- 27. 在sql server中插入批量數據,同時忽略/捕獲重複行
- 28. 插入數據使用JPA一對一的映射連同mysql複合主鍵
- 29. 在Java中的另一個數據映射器內使用數據映射器?
- 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