2016-02-02 4 views
6

мы обновили наше приложение с Rails 4.1.14 на 4.2.5.1 и ударил следующий вопрос:Разница в ActiveRecord Setter между Rails 4.1 и 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 

Видимо, объект сеттеры DUP каждый объект (если у меня есть массив, каждый объект внутри будет обманут, а также), и мне интересно, если это предназначено и часть какой-то новой функции безопасности?

Update

Я использую рубин-2.2.2p95 для обоих рельсов версии. Для справки я сделал небольшой проект:

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 

После этого, я только изменил Rails версию 4.1.14 в Gemfile, и попробовал еще раз => оба object_ids были одинаковыми. Поэтому он не может полагаться только на версии Ruby, ...

UPDATE2

Это также справедливо и для рубинового 2.2.3 и JRuby 9.0.4.0 ... ar_model.attributes_before_type_cast['some_attribute'] содержит реальный объект.

+0

Какова ваша точная версия Rails? Когда я проверил Rails 4.2.5, это выражение вернет True. Во-вторых, я не думаю, что это имеет какое-либо отношение к Rails. Это задача Ruby для обработки ссылки на объект/Управление памятью –

+1

Я дважды проверял с 4.1.14 и 4.2.0 и 4.2.5.1; последние два возвращают false. Я только обновил рельсы и изобрел, никаких других камней или рубинов. –

+0

Это больше похоже на проблему с Ruby. Помните, что ruby ​​всегда передается по значению вместо передачи по ссылке. Для дальнейшего чтения проверьте это: http://stackoverflow.com/questions/1872110/is-ruby-pass-by-reference-or-by-value – aliibrahim

ответ

Смежные вопросы