first_or_create vs find_or_create_by

时间:2017-02-11 17:05:54

标签: ruby-on-rails activerecord

first_or_create似乎记录得少得多,所以我想知道是不是因为这两种方法是同义词。

2 个答案:

答案 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_1attribute_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的这种用法非常适合我的需求。