我像这样调用first_or_create:
collection = Collection.first_or_create(:title => title)
有没有办法确定结果是现有条目还是新创建的条目?到目前为止,我提出的最佳解决方案是使用first_or_initialize:
collection = Collection.first_or_initialize(:title => title)
if collection.id.nil?
<process>
collection.save
end
但这感觉有点笨拙。有没有办法直接从first_or_create获取此信息?
答案 0 :(得分:17)
据我所知,你无法知道。有两个选项可以检查created_at
时间(不可靠),或者使用first_or_initialize
,然后检查new_record?
是否为真,如果是,请执行其他操作然后调用{ {1}}。无论如何,这可能是最好的方法,因为您可能不想在保存其他关系之前完成保存,并且您可能希望在同一个数据库事务中完成所有这些操作。
答案 1 :(得分:16)
first_or_create
接受一个仅在创建新记录时才会执行的块,您可以在该块内设置一些标志以指示它是新记录,例如
MyObject.where(attr: "value").first_or_create do |obj|
@my_object_created = true
end
答案 2 :(得分:3)
使用first_or_create
您无法确定它是新创建的对象还是数据库中的对象。可能的棘手解决方案是将created_at
值与当前时间进行比较。如果您不经常创建对象,则此方法有效。
顺便问一下,为什么你需要知道它是否是新创建的对象?