説明するには長すぎるため*_attributes=(attributes)
、別のモデルのネストされた属性を受け入れるモデルのメソッドをオーバーライドする必要があります。例として、ここに私のモデルがあります:
class Experience < ActiveRecord::Base
accepts_nested_attributes_for :company
def company_attributes=(attributes)
...
end
end
最初に、このメソッドが呼び出されるたびに新しい会社を作成し始めました ( に置き換え...
てself.company = Company.new(attributes)
)。言うまでもなく、新しい会社をデータベースに保存します。
そのようなことをしていることがわかったとき、このメソッドを次のように編集しました。
def company_attributes=(attributes)
self.company.nil? ? self.company = Company.new : self.company.assign_attributes(attributes)
end
これは正しい方法のように思われました (nil の場合にのみ新しいオブジェクトを作成し、そうでない場合は変更された属性を割り当てるだけです)。ただし、新しいエクスペリエンスの場合は、新しく作成された会社をデータベースに保存していましたが、エクスペリエンスを編集すると、メソッドの単一行の直後に会社の属性が変更されますが、データベースには保存されません。
質問 1:*_attributes=(attributes)
生成されたメソッドはどのように機能しますか?
質問 2:company_attributes=(attributes)
新しいエクスペリエンスを作成するときに新しい会社を作成し、エクスペリエンスを編集するときに会社の属性を編集するという目標を達成するには、方法をどのように変更すればよいですか。
ありがとう