Gibt es eine Alternative zu update_attributes, bei der der Datensatz nicht gespeichert wird?
So könnte ich etwas machen wie:
@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
BTW, ich weiß, ich kann @car.model = 'Sierra'
, aber ich möchte sie alle in einer Zeile aktualisieren.
Ich glaube, was Sie suchen, ist assign_attributes
.
Es ist im Grunde dasselbe wie update_attributes, speichert aber den Datensatz nicht:
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
Sie können assign_attributes
oder attributes=
(sie sind die gleichen)
Update Methoden Spickzettel (für Rails 4):
update_attributes
= assign_attributes
+ save
attributes=
= Alias von assign_attributes
update
= Alias von update_attributes
Quelle:
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
Noch ein Spickzettel:
http://www.davidverhasselt.com/set-attributes-in-activerecord/#cheat-sheet
Sie können die Methode "Attribute" verwenden:
@car.attributes = {:model => 'Sierra', :years => '1990', :looks => 'Sexy'}
Quelle: http://api.rubyonrails.org/classes/ActiveRecord/Base.html
attributes = (new_attributes, guard_protected_attributes = true) Ermöglicht das gleichzeitige Festlegen aller Attribute, indem ein Hash mit Schlüsseln übergeben wird, die den Attributnamen entsprechen (was wiederum der Fall ist) entspricht den Spaltennamen).
Wenn guard_protected_attributes auf true gesetzt ist (Standardeinstellung), können vertrauliche Attribute mithilfe des attr_protected-Makros vor dieser Form der Massenzuweisung geschützt werden. Alternativ können Sie festlegen, auf welche Attribute mit dem Makro attr_accessible zugegriffen werden kann. Dann können alle Attribute, die darin nicht enthalten sind, nicht massenweise zugewiesen werden.
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