Ruby on Rails: metodo virtuale che modifiyng modello attribuisce con l'aiuto di << non ha potuto salvare l'attributo

StackOverflow https://stackoverflow.com/questions/3119008

Domanda

Non è il modello Ratifica con commento attributo (di tipo testo )

def Ratification < ActiveRecord::Base
  attr_accessor :add_comment
  def add_comment=(text)
    self.comment ||= ""
    self.comment << "\r\n" + text
  end
end

E se uso add_comment = è ok prima di salvare l'oggetto. Dopo aver salvato le modifiche di commento è stata abbandonata.

>> r = Ratification.last
  Ratification Load (0.6ms)   SELECT * FROM `ratifications` ORDER BY ratifications.id DESC LIMIT 1
=> #<Ratification id: 8, user_id: 686, comment: "dasads", created_at: "2010-06-25 13:16:24", updated_at: "2010-06-25 13:38:36">
>> r.comment
=> "dasads"
>> r.add_comment="text"
=> "text"
>> r.comment
=> "dasads\r\ntext"
>> r.save
  SQL (0.7ms)   BEGIN
  SQL (0.2ms)   COMMIT
=> true
>> r.reload
  Ratification Load (1.6ms)   SELECT * FROM `ratifications` WHERE (`ratifications`.`id` = 8) 
=> #<Ratification id: 8, user_id: 686, comment: "dasads", created_at: "2010-06-25 13:16:24", updated_at: "2010-06-25 13:38:36">
>> r.comment
=> "dasads"

Perché?!

Rails 2.3.8 Ruby 1.8

È stato utile?

Soluzione

Hrrrm ... che è strano, sto vedendo un comportamento simile dal mio rotaie app quando cerco di fare:

@s.name << "test"

e quindi ricaricare ... il nome originale è sempre di reset!

Tuttavia, se lo faccio @ s.name + = "test"

allora anche dopo aver ricaricato, il nuovo nome viene salvato.

Io non sono sicuro perché << si comporta in quel modo, ma io di solito predefinito a + = in tutti i casi, quindi non ho mai notato prima. Non cambiando a + = aiuto?

Modifica: Guardando l'API, forse è perché << modifica la stringa originale, mentre + o + = fa una nuova stringa, che contiene il vecchio? Forse rotaie in qualche modo salva solo le cose che ha segnato come nuovo (e non modificato?)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top