Rails 提供了多种设置Model属性的方法,方法之间又各有异同,有的会出发回调,有的不会,有的会对所属对象其它属性也产生影响。 因此理解方法之间的区别就显得很重要。
Rails 提供了多种设置Model属性的方法,方法之间又各有异同,有的会出发回调,有的不会,有的会对所属对象其它属性也产生影响。 因此理解方法之间的区别就显得很重要。
最方便的先来,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 |
这是最常用的赋值方法,这个也是Rails默认生成的赋值方法。赋值后,对应的属性会被标记为dirty, 脏数据,但是并没有更新到数据里去。
调用save
会把数据更新到数据库。调用reload
会丢弃脏数据。
这是上面那个赋值方法会调用的方法, 这个方法也不会更新数据库。
这个方法会直接更新数据到数据库,而且会忽略到所有的验证,直接更新数据库。
这个赋值方法会根据右边传入的哈希,对相应的属性进行赋值。其它的属性不会有变动。
user.assign_attributes { name: 'feng' }
在Rails 3中,这个方法叫update_attributes
, 这个方法会更新对象,进行验证,然后更新到数据库.这方法会把所属对象中别的脏数据也更新到数据库。
这个方法会生成 SQL Update,直接更新到数据库,跳过所有的数据验证和回调。
跟上面的方法类似
这是一个类方法
这个方法的第一个参数是 id
, 后面是更新的属性hash。 第一个参数,可以是一个数组, 一组 id
。
批量更新,be careful!