407

update_attributesレコードを保存しない代替手段はありますか?

だから私は次のようなことができます:

@car = Car.new(:make => 'GMC')
#other processing
@car.update_attributes(:model => 'Sierra', :year => "2012", :looks => "Super Sexy, wanna make love to it")
#other processing
@car.save

ところで、できることはわかっていますが@car.model = 'Sierra'、すべてを 1 行で更新したいと考えています。

4

4 に答える 4

635

あなたが探しているのは だと思いますassign_attributes

基本的に update_attributes と同じですが、レコードを保存しません:

class User < ActiveRecord::Base
  attr_accessible :name
  attr_accessible :name, :is_admin, :as => :admin
end

user = User.new
user.assign_attributes({ :name => 'Josh', :is_admin => true }) # Raises an ActiveModel::MassAssignmentSecurity::Error
user.assign_attributes({ :name => 'Bob'})
user.name        # => "Bob"
user.is_admin?   # => false
user.new_record? # => true
于 2012-08-02T17:54:08.230 に答える
197

assign_attributesまたはを使用できますattributes=(それらは同じです)

更新メソッドのチート シート (Rails 6 用):

  • update= assign_attributes+save
  • attributes== の別名assign_attributes
  • update_attributes= 非推奨、エイリアスupdate

ソース:
https://github.com/rails/rails/blob/master/activerecord/lib/active_record/persistence.rb
https://github.com/rails/rails/blob/master/activerecord/lib/active_record/attribute_assignment .rb

別のチート シート:
http://www.davidverhasselt.com/set-attributes-in-activerecord/#cheat-sheet

于 2013-09-12T11:31:52.807 に答える
66

「属性」メソッドを使用できます。

@car.attributes = {:model => 'Sierra', :years => '1990', :looks => 'Sexy'}

ソース: http://api.rubyonrails.org/classes/ActiveRecord/Base.html

attributes=(new_attributes, guard_protected_attributes = true) 属性名に一致するキーを持つハッシュを渡すことで、すべての属性を一度に設定できます (これも列名に一致します)。

Guard_protected_attributes が true (デフォルト) の場合、attr_protected マクロを使用して、機密属性をこの形式の一括代入から保護できます。または、attr_accessible マクロでアクセスできる属性を指定することもできます。その場合、それに含まれていないすべての属性は一括割り当てできません。

class User < ActiveRecord::Base
  attr_protected :is_admin
end

user = User.new
user.attributes = { :username => 'Phusion', :is_admin => true }
user.username   # => "Phusion"
user.is_admin?  # => false

user.send(:attributes=, { :username => 'Phusion', :is_admin => true }, false)
user.is_admin?  # => true
于 2011-07-21T02:25:14.127 に答える