2016-02-02 10 views
6

wir ein Upgrade unsere Anwendung von Rails 4.1.14 bis 4.2.5.1 und schlug das folgende Problem:Unterschied in ActiveRecord Setter zwischen Rails 4.1 und 4.2?

string = "SomeString" 
ar_model = SomeArModel.new 
ar_model.some_attribute = string 

# next line is true for 4.1, but fails for 4.2 
ar_model.some_attribute.object_id == string.object_id 

Offenbar Objekt Setter dup jedes Objekt (wenn ich ein Array haben, jedes Objekt innerhalb als auch hinters Licht geführt werden) und ich frage mich, ob dies beabsichtigt ist und Teil eines neuen Sicherheitsmerkmals ist.

aktualisieren

Ich benutze rubin 2.2.2p95 für beide Version Schienen. Als Referenz habe ich ein kleines Projekt:

rails new testproject 
rails g model Building name:string 
rails db:migrate 
rails c 
    >> b = Building.new 
    >> name = "Testname" 
    >> b.name = name 
    >> name.object_id # => 70199493308960 
    >> b.name.object_id # => 70199493278780 

Danach wechselte ich nur Rails-Version 4.1.14 in Gemfile, und versuchte es erneut => beide object_ids gleich waren. So kann es nicht verlassen nur auf der Ruby-Version ...

Update2

Es gilt auch für die rubin 2.2.3 und JRuby 9.0.4.0 ... ar_model.attributes_before_type_cast['some_attribute'] enthält die echtes Objekt.

+0

Was ist Ihre genaue Rails-Version? Wie ich auf Schienen 4.2.5 überprüft habe, gibt der obige Ausdruck True zurück. Zweitens denke ich, das hat nichts mit Rails zu tun. Es ist Ruby Job, Objektreferenz/Speichermanagement zu behandeln –

+1

Ich prüfte doppelt mit 4.1.14 und 4.2.0 und 4.2.5.1; die letzten beiden kehren falsch zurück. Ich habe nur die Rails upgegradet und keine anderen Edelsteine ​​oder Rubine entworfen. –

+0

Das ist mehr wie ein Ruby-Problem. Denken Sie daran, dass Ruby immer "pass-by-value" statt "pass-by-reference" ist. Für weitere Informationen überprüfen Sie dies: http://stackoverflow.com/questions/1872110/is-ruby-pass-by-reference-or-by-value – aliibrahim

Antwort

Verwandte Themen