我有一个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