first_or_create
似乎记录得少得多,所以我想知道是不是因为这两种方法是同义词。
答案 0 :(得分:32)
基本上:
Foo.where(attributes).first_or_create
与:
相同Foo.find_or_create_by(attributes)
#first_or_create
有时会被误解,因为人们希望它按照给定的属性进行搜索,但事实并非如此。又名
Foo.first_or_create(attributes)
不会搜索满足foo
的{{1}}。如果存在,则需要第一个attributes
。如果查找条件是用于创建的条件的子集,则它很有用。又名
foo
会找到第一个Foo.where(something: value).first_or_create(attributes)
foo
。如果不存在,则使用something: value
创建它。
答案 1 :(得分:0)
@ndnenkov的答案是正确的,但我想进一步说明为什么我认为有人可能会使用find_or_create
:
请考虑以下情况:Foo必须先具有attribute_subset_1
或attribute_subset_2
才能创建。可以(伪)将其编码为:
if attribute_subset_1 then
Foo.where(attribute_subset_1).first_or_create(attributes)
elsif attribute_subset_2 then
Foo.where(attribute_subset_2).first_or_create(attributes)
else
Raise error " insufficient attributes"
end
在这种情况下,我认为find_or_create_by
不起作用……至少不容易实现。我很想知道是否有任何不同的看法,但对我来说,发现first_or_create
的这种用法非常适合我的需求。