8

関連するクラスのインスタンスを常に返すhas_oneように、Rails 関連付けメソッドをオーバーライド/拡張​​したいと考えています。(データベースにまだ存在しない場合は、新しいデータベースを作成して親インスタンスに割り当てたいと思います。)

理想的には、組み込みの Rails 関連付け拡張メカニズムを通じてこれを行いたいと考えています。ただし、「getter」メソッドの名前がわからないため、何をオーバーライドすればよいかわかりません。

nil のときに新しいオブジェクトをインスタンス化できるように、関連ゲッターをオーバーライドするにはどうすればよいですか?

4

2 に答える 2

13

Rails 3 の時点で、alias_method は関連付けメソッドをオーバーライドするための推奨される方法ではありません。ドキュメントからの引用:

生成されたメソッドのオーバーライド

関連付けメソッドは、モデル クラスに含まれるモジュールで生成されます。これにより、独自のメソッドで簡単にオーバーライドし、元の生成されたメソッドを super で呼び出すことができます。例えば:

class Car < ActiveRecord::Base
  belongs_to :owner
  belongs_to :old_owner
  def owner=(new_owner)
    self.old_owner = self.owner
    super
  end
end

モデル クラスが Project の場合、モジュールの名前は Project::GeneratedFeatureMethods になります。GeneratedFeatureMethods モジュールは、(匿名の) 生成された属性メソッド モジュールの直後のモデル クラスに含まれます。つまり、関連付けによって、同じ名前の属性のメソッドがオーバーライドされます。

于 2013-11-21T21:42:30.923 に答える
10

元のメソッドに別名を付けてから、同じ名前で新しいメソッドを定義できます。

例えば:

class MyModel < ActiveRecord::Base
  has_one :associated_model

  alias :old_associated_model :associated_model

  def associated_model
    old_associated_model || AssociatedModel.new(my_model_id: id)
  end

end

これがこの状況を処理する標準的な方法であるかどうかはわかりませんが、うまくいくはずです。

于 2012-10-24T18:14:08.133 に答える