2016-02-02 11 views
6

Zostaliśmy przeniesieni z naszej aplikacji Rails 4.1.14 do 4.2.5.1 i uderzył następujący problem:Różnica w ActiveRecord Setter między Rails 4.1 i 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 

Najwyraźniej ustawiaczy obiektów dup każdy przedmiot (jeśli mam tablicę każdy obiekt wewnątrz zostanie oszukany, a także) i zastanawiam się, czy jest to zamierzone i częścią jakiejś nowej funkcji bezpieczeństwa?

Aktualizacja

używam ruby-2.2.2p95 dla obu szyn wersję. Dla porównania zrobiłem mały 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 

Później, ja tylko zmienił Rails wersję do 4.1.14 w Gemfile i spróbował ponownie => obie object_ids były takie same. Więc to nie może polegać tylko o wersji Ruby ...

Update2

Posiada również prawdziwe dla ruby-2.2.3 i JRuby 9.0.4.0 ... ar_model.attributes_before_type_cast['some_attribute'] zawiera prawdziwy obiekt.

+0

Jaki jest Twój dokładna wersja Rails? Jak sprawdziłem dla Rails 4.2.5 powyższe wyrażenie zwraca True. Po drugie, nie sądzę, że ma to coś wspólnego z Railsami. Jest to zadanie w języku Ruby do obsługi odwołań do obiektów/zarządzania pamięcią –

+1

Sprawdziłem dwukrotnie przy pomocy 4.1.14 oraz 4.2.0 i 4.2.5.1; dwa ostatnie zwracają fałsz. Ulepszyłem tylko szyny i wymyśliłem, nie ma innych klejnotów ani ruby. –

+0

To bardziej przypomina problem z Rubinem. Pamiętaj, że ruby ​​jest zawsze wartością typu pass-by-value zamiast pass-by-reference. W celu dalszego czytania sprawdź to: http://stackoverflow.com/questions/1872110/is-ruby-pass-by-reference-or-by-by-value – aliibrahim

Odpowiedz

Powiązane problemy