2017-05-22 9 views
0

私は、モデル自体に直接ではなくアソシエーション上にいくつかのアトリビュートが存在する場合に、アトリビュートを変更したいActiveRecordモデルインスタンスを持っています。すべての属性はハッシュとして入力されます。ActiveRecord関連付けられた属性をハッシュから設定する方法は?

このコードはテストスイートの一部です。この場合、大量の属性割り当ての問題については心配していません。

instance.update_attributes(hash)を使用して更新しようとすると失敗します。

代わりに、ハッシュをループしてこのような属性を設定しようとしました。

hash.each do |key, val| 
    instance[key] = val 
end 

このメソッドは、インスタンス上に直接存在する属性を設定しますが、関連レコード

答えて

1

delegateアプローチに行くを与えるActiveModel::MissingAttributeError Exception: can't write unknown attribute 'foo'に関連付けられている属性に例外をスローします。コンソールで

class Foo 
    attr_accessor :bar, :foo_attribute 
    delegate :bar_attribute=, to: :bar 

    def initialize 
     @bar = Bar.new 
    end 
    end 

    class Bar 
    attr_accessor :bar_attribute 
    end 

次に、:の線に沿って何か

hsh = {foo_attribute: 'foo', bar_attribute: 'bar'} 
    f = Foo.new 
    hsh.each do |k,v| 
    f.send("#{k}=",v) 
    end 
    f.inspect 
    => "#<Foo:0x00000004f1f0f0 @bar=#<Bar:0x00000004f1f0c8 @bar_attribute=\"bar\">, @foo_attribute=\"foo\">" 
    f.bar.inspect 
    => "#<Bar:0x00000004f1f0c8 @bar_attribute=\"bar\">" 
関連する問題