6

我这样调用 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

但这感觉有点hacky。有没有办法直接从 first_or_create 获取这些信息?

4

3 回答 3

22

first_or_create接受一个只有在创建新记录时才会执行的块,您可以在该块内设置一些标志以指示它是一个新记录,例如

MyObject.where(attr: "value").first_or_create do |obj|
  @my_object_created = true
end
于 2015-01-31T23:50:17.603 回答
20

据我所知,你不知道。两个选项是检查created_at时间(不可靠),或者改为使用first_or_initialize, 然后检查是否new_record?为真,如果是,则执行其他操作,然后调用save!. 无论如何,这对您来说可能是最好的方法,因为您可能不希望在保存其他关系之前完成保存,并且您可能希望在同一个数据库事务中完成所有这些操作。

于 2013-01-24T21:31:52.070 回答
3

使用first_or_create您无法确定它是新创建的对象还是来自数据库的对象。可能的棘手解决方案是将created_at值与当前时间进行比较。如果您不经常创建对象,则此方法有效。

顺便说一句,为什么你需要知道它是不是新创建的对象?

于 2013-01-24T21:19:52.643 回答