如果我这样做
widget = Widget.find_or_create_by_widgetid(:widgetid => "12345", :param2 => "folk")
等。那么如何判断newobj是找到的还是新创建的Widget?我可以在widget
上有条件地测试哪些东西会告诉我吗?
答案 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)
现在这个方法接受一个块,传递给创建,所以我选择:
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