0

在rails中使用find_or_create_by_name时,如果找到表并且您为其他属性传递参数,它会更新表吗?例如:

College.find_or_create_by_name(name: 'University of Pittsburgh', calendar: 'semester')

假设已经创建了 University of Pittsburgh 表,但日历属性为 nil。此代码会更新日历属性以使其成为“学期”吗?

一些背景......我正在制作一个包含不同大学页面的网站。该网站的一部分涉及列出大学的一堆数据。现在我正在编写我的种子文件,但我预计必须更改它。我希望网站上有数百所学校,每所学校都有数百条不同的数据。我在想拥有种子文件并使用 find_or_create_by_name 是一个很好的方法,但如果你有更好的方法,请告诉我。

4

2 回答 2

2

如果记录已经存在,该代码将不会更新记录。我会建议:

@college = College.find_or_initialize_by_name("Robot House!!")
@college.attributes = {
  reputation: "partyhouse",
  occupants: "robots"
}
@college.save!

如果需要,您可以将其包装在一个方法中。

于 2013-05-31T16:44:43.117 回答
0

find_or_create_by_正如它所说的那样:它要么创建一个新项目(创建保存到数据库),要么找到现有的项目,这意味着从数据库中读取它。
创建对象时,它在验证错误时返回 false

因此,要保存更改,您可以使用正常的更新方法:

if @college= College.find_or_create_by_name(given_attributes) &&
   @college.update_attributes(given_attributes)
else
  # handle validation errors
end

它不会两次访问数据库,因为update_attributes不会对新创建的对象应用任何更改(但可能对现有对象进行更改)

写得更明确:

@college= College.find_or_create_by_name(given_attributes)
if @college.present?
   if @college.update_attributes(given_attributes)
     # do your success stuff
   else
     # handle update validation errors
   end
else
  # handle find_or_create errors
end
于 2013-05-31T17:02:45.650 回答