Rails ActiveRecord 不同的赋值方法 · 简单心理技术团队

1,228 阅读2分钟
Rails 提供了多种设置Model属性的方法,方法之间又各有异同,有的会出发回调,有的不会,有的会对所属对象其它属性也产生影响。 因此理解方法之间的区别就显得很重要。

Rails 提供了多种设置Model属性的方法,方法之间又各有异同,有的会出发回调,有的不会,有的会对所属对象其它属性也产生影响。 因此理解方法之间的区别就显得很重要。

Cheat Sheet

最方便的先来,cheetsheet表,方便查询:

Method Uses Default Accessor Saved to Database Validations Callbacks Touches updated_at Readonly check
attribute= Yes No n/a n/a n/a n/a
write_attribute No No n/a n/a n/a n/a
update_attribute Yes Yes No Yes Yes Yes
attributes= Yes No n/a n/a n/a n/a
update Yes Yes Yes Yes Yes Yes
update_column No Yes No No No Yes
update_columns No Yes No No No Yes
User::update Yes Yes Yes Yes Yes Yes
User::update_all No Yes No No No No

user.name =

这是最常用的赋值方法,这个也是Rails默认生成的赋值方法。赋值后,对应的属性会被标记为dirty, 脏数据,但是并没有更新到数据里去。

调用save会把数据更新到数据库。调用reload会丢弃脏数据。

user.write_attribute(:name, 'feng')

这是上面那个赋值方法会调用的方法, 这个方法也不会更新数据库。

user.update_attribute(:name, 'feng')

这个方法会直接更新数据到数据库,而且会忽略到所有的验证,直接更新数据库。

user.attributes = { name: 'feng' }

这个赋值方法会根据右边传入的哈希,对相应的属性进行赋值。其它的属性不会有变动。

user.assign_attributes { name: 'feng' }

user.update(name: 'feng')

在Rails 3中,这个方法叫update_attributes, 这个方法会更新对象,进行验证,然后更新到数据库.这方法会把所属对象中别的脏数据也更新到数据库。

user.update_columns(name: 'feng')

这个方法会生成 SQL Update,直接更新到数据库,跳过所有的数据验证和回调。

user.update_column(:name, 'feng')

跟上面的方法类似

User.update(1, name: 'feng')

这是一个类方法

这个方法的第一个参数是 id, 后面是更新的属性hash。 第一个参数,可以是一个数组, 一组 id

User.update_all(name: 'feng')

批量更新,be careful!