first_or_create:确定调用哪个

时间:2013-01-24 21:09:08

标签: ruby-on-rails

我像这样调用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获取此信息?

3 个答案:

答案 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值与当前时间进行比较。如果您不经常创建对象,则此方法有效。

顺便问一下,为什么你需要知道它是否是新创建的对象?