Rails的ActiveRecord:如何知道find_or_create_byfind或创build?

潜在的愚蠢的问题,但我只是没有得到它。

如果我做

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

等等,那么我怎么知道,如果newobj是一个发现或新创build的小工具? 有什么我可以有条件地testing小部件,会告诉我?

我不相信有一种方法可以告诉对象是新创build的还是已经存在的。 您可以使用find_or_initialize_by_widgetid ,而不保存新对象。 然后你可以检查widget.new_record? 它会告诉你对象是否被保存。 你必须在一个新的对象的代码块中保存一个调用,但是无论如何你都要做这个检查,它不应该破坏代码的stream程。

所以:

 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 

Rails 4

find_or_create_by(attributes,&block)

现在这个方法接受一个块,它被传递下来创build,所以我会去:

 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 

根据你想要做什么,你可以使用一个块:

 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