5

説明するには長すぎるため*_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)新しいエクスペリエンスを作成するときに新しい会社を作成し、エクスペリエンスを編集するときに会社の属性を編集するという目標を達成するには、方法をどのように変更すればよいですか。

ありがとう

4

0 に答える 0