Rails ActiveRecord:如何找到或创建find_or_create_by?

时间:2011-11-06 17:44:16

标签: ruby-on-rails activerecord

如果我这样做

widget = Widget.find_or_create_by_widgetid(:widgetid => "12345", :param2 => "folk") 

等。那么如何判断newobj是找到的还是新创建的Widget?我可以在widget上有条件地测试哪些东西会告诉我吗?

3 个答案:

答案 0 :(得分:54)

我不相信有一种方法可以判断对象是新创建的还是已经存在。您可以使用find_or_initialize_by_widgetid而不保存新对象。然后,您可以检查widget.new_record?,它将告诉您对象是否已保存。您必须在新对象的代码块中放置一个保存调用,但是无论如何都要进行检查,它不应该破坏代码流。

所以:

widget = find_or_initialize_by_widgetid(:widgetid => "12345", :param2 => "folk")
if widget.new_record?
  widget.save!
  # Code for a new widget
else
  # Code for an existing widget
end

答案 1 :(得分:15)

Rails 4

find_or_create_by(attributes, &block)

现在这个方法接受一个块,传递给创建,所以我选择:

widget = Widget.find_or_create_by(:widgetid => "12345", :param2 => "folk") do |w|
  # if you got in here, this is a new widget
end

在Rails 4中执行此操作的另一种方法是:

widget = Widget.where(:widgetid => "12345", :param2 => "folk").first_or_initialize
if widget.new_record?
  # this is a new widget
end

答案 2 :(得分:-2)

根据您的目的,您可以使用块:

widget = find_or_create_by(widgetid: "12345") do |widget|
  widget.param2 = "folk"
  if widget.new_record?
    # Code for a new widget.
  else
    # Code for an existing widget.
  end
end