wake-up-neo.com

Rails update_attributes ohne zu speichern?

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.

364
tybro0103

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
571
Ajedi32

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

159
Yarin

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
63
bruno077