Ruby on rails 首先创建与查找或创建

Ruby on rails 首先创建与查找或创建,ruby-on-rails,activerecord,Ruby On Rails,Activerecord,first\u或\u create似乎没有多少文档记录,所以我想知道这是否只是因为这两种方法是同义的 基本上: Foo.where(attributes).first_or_create 同: Foo.find_or_create_by(attributes) #first_或_create有时会被误解,因为人们期望它根据给定的属性进行搜索,但事实并非如此。阿卡 Foo.first_or_create(attributes) 不会搜索满足属性的foo。如果存在,则需要第一个foo。如果用

first\u或\u create
似乎没有多少文档记录,所以我想知道这是否只是因为这两种方法是同义的

基本上:

Foo.where(attributes).first_or_create
同:

Foo.find_or_create_by(attributes)

#first_或_create
有时会被误解,因为人们期望它根据给定的属性进行搜索,但事实并非如此。阿卡

Foo.first_or_create(attributes)
不会搜索满足
属性的
foo
。如果存在,则需要第一个
foo
。如果用于查找的条件是用于创建的条件的子集,那么它非常有用。阿卡

Foo.where(something: value).first_or_create(attributes)

将找到第一个
foo
,其中
something:value
。如果没有,它将使用
属性创建它。

@ndnenkov的答案是正确的,但我想进一步说明为什么我认为可以使用
查找或创建

考虑以下情况:在创建Foo之前,Foo必须具有
attribute\u subset\u 1
attribute\u subset\u 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\u或
创建\u不起作用……至少不容易。我很想知道是否有人对此有不同的看法,但对我来说,我发现使用
first\u或\u create
非常适合我的需要。

然而,这两种方法在执行SQL方面并不相同
first\u或\u create
将使用
ORDER BY id LIMIT 1
,而
find\u或\u create\u BY
将只使用
LIMIT 1
。在大多数情况下,这并不重要,但随着数据集的增长,您可能会发现这种微小的差异会使速度降低几个数量级(即使有索引)。事实确实如此,这意味着
find\u或*\u by
应该是首选语法,而不是
where(…)。首先,提交解释了为什么文档记录较少。是的,有更多的内容,然后可能会出现混淆。更多关于它的信息,请访问@Saul
first\u或\u create
出现在中,并在中被弃用。在这段时间里,它的代码没有多大变化。这一切都归结为
first
,它按
id
排序,除非明确指定了其他排序。我可能遗漏了什么,但我怀疑
first\u或\u create
是否曾抑制过
ORDER by
子句。