2016-08-31 9 views
0

ActiveModel :: Dirtyは、Array.push(または、最近読んだことのある他の修正方法)をカバーしていないpostgres配列は、prettyが確立されています。たとえば、AppleモデルにApple.seedsという配列がある場合、Railsコンソールでは次のように表示されます。attribute =とArray.pushの両方からの変更ログ

johnny = Apple.new() 
# => <Apple #blahblahblah> 
johnny.seeds 
# => [] (assuming [] default) 
johnny.seeds << "Oblong" 
# => ["Oblong"] 
johnny.changed? 
# => false 
johnny.seeds = [] 
johnny.seeds += ["Oblong"] 
# => ["Oblong"] 
johnny.changed? 
# => true 

だから、配列属性を変更する2つの異なる方法を使用することができますが、Railsは唯一のセッターを使用するものを認識しています。私の質問は、johnny.seeds << (x)johnny.changesに反映されるように、ActiveRecordオブジェクトのコンテキストでセッターのように振るようにプッシュを取得する方法(Arrayクラスをマングルしない)ですか?

(私の側では、これは無意識のうちに、彼らはこの制限を認識していなかったので、変更を記録するために失敗し、アレイの属性にプッシュを使用することから、将来の開発を防ぐためです。)

答えて

1

これは、との任意の列に問題がありますArrayオブジェクトだけでなく、変更可能なオブジェクトです。

seeder = Apple.first 
seeder.name 
=> "Johnny " 

seeder.name << " Appleseed" 
seeder.changed? 
=> false 

あなたは、将来の開発者のためのメモを残し方がいいでしょうが、そうでなければ、しかし、changed?が戻っtrueが来るという理由だけで、あなたを保証するものではありませんのでご注意changed?方法に

class Apple 

    alias_method 'old_changed?', 'changed?' 

    def changed? 
    return old_changed? if old_changed? 
    return (seeds.count > 0) if new_record? 
    return seeds != Apple.find(id).seeds 
    end 

end 

を交換を検討することができます変更されていないobject_idsのフィールドはupdate_attributesに更新されます...あなたはそうではないことがわかります。これらの落とし穴を理解している有能なレール開発者を雇う必要があるかもしれません。

関連する問題