12

我真的很喜欢这个first_or_create方法:

# Find the first user named Scarlett or create a new one with a particular last name.
User.where(:first_name => 'Scarlett').first_or_create(:last_name => 'Johansson')
# => <User id: 2, first_name: 'Scarlett', last_name: 'Johansson'>

我想知道如果它不存在或不同,我如何也可以使用 last_name 'Johannson' 更新用户。寻找最简单的方法。与上述类似的单衬里将是理想的。

一种可能的方法是结合使用 first_or_initialize 和 update_attributes。我对这种方法唯一担心的是,即使提供的字段 100% 匹配,它也会运行更新。

4

2 回答 2

23

Zaid 非常接近正确。

User.where(first_name: 'Scarlett').first_or_create.update(last_name: 'Johansson')

这里有详细的区别。(注意:这适用于 Rails 3+ 和 Rails 4+)

  1. first_or_createvs.的区别在于first_or_initialize使用_initialize方法.new不保存记录 vs.create自动保存。

  2. .update.update_attributes,之间的区别.update_attributes是当你有一个值的哈希值时使用什么,通常来自一个表单提交,比如params. 另一方面,.update 让您可以轻松地指定每个属性,如上所示(field_column: value, field_column2: value2),等等。

就像 Zaid 说的那样,但它同时适用于.update.update_attributes,rails 数据库更新“......只有在需要进行更改时才会访问数据库......”

于 2014-09-12T02:48:11.603 回答
6

first_or_initializeupdate_attributes应该没问题。Rails 足够聪明,update_attributes只有在需要进行更改时才会访问数据库(您应该能够使用控制台/日志自己确认)。

于 2013-05-02T02:08:21.627 回答