Rails 4.1和4.2之间ActiveRecord Setter的区别?

时间:2016-02-02 12:57:48

标签: ruby-on-rails ruby activerecord

我们将应用程序从Rails 4.1.14升级到4.2.5.1并遇到以下问题:

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

显然,对象设置器会复制每个对象(如果我有一个数组,内部的每个对象都会被欺骗),我想知道,如果这是预期的并且是一些新的安全功能的一部分?

更新

我将ruby-2.2.2p95用于两个rails版本。作为参考,我做了一个小项目:

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

之后,我只在Gemfile中将Rails版本更改为4.1.14,并再次尝试=>两个object_ids都是一样的。 所以它不能仅仅依赖 在Ruby版本上......

UPDATE2

对于ruby-2.2.3和JRuby 9.0.4.0也适用... ar_model.attributes_before_type_cast['some_attribute']包含真实对象。

1 个答案:

答案 0 :(得分:0)

根据Rails开发人员的说法,这是设计的:

https://github.com/rails/rails/issues/23430