2016-02-02 53 views
6

我們從Rails的升級,我們的應用4.1.14到4.2.5.1,撞上了以下問題:Rails 4.1和4.2之間ActiveRecord Setter的區別?

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每一個對象(如果我有一個數組,每個對象內也會被矇騙),我想知道,如果這是有意的,並且是一些新的安全功能的一部分?

更新

我用紅寶石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;後兩者返回假。我只升級rails和devise,沒有其他寶石或紅寶石 –

+0

這更像是一個Ruby問題。請記住,ruby總是通過值而不是傳遞引用。爲進一步閱讀檢查了這一點:http://stackoverflow.com/questions/1872110/is-ruby-pass-by-reference-or-by-value – aliibrahim

回答

相關問題