1

実行時にオブジェクト (ActiveRecord::Base のインスタンス) を拡張し、(関連付けを追加するために) クラス メソッドを呼び出したいと考えていますhas_many。私の理想的なコードは次のようになります。

class User < ActiveRecord::Base
end

module Seller
  has_many :bookings, :foreign_key => :seller_id
end

module Buyer
  has_many :bookings, :foreign_key => :buyer_id
end

user = User.find(1)
user.extend Seller
user.bookings

モジュールをクラスに含めたくないことに注意してくださいUser。すべてのユーザーオブジェクトではなく、単一のユーザーオブジェクトの動作を拡張したいのです。

4

1 に答える 1

2

self.extendedこれは、フックと固有クラスを含むトリックです。

class User
  def self.haz_many name
    define_method name do 
      "value of #{name}"
    end
  end
end

module Seller
  def self.extended base
    base.singleton_class.instance_eval do
      haz_many :sellers
    end
  end
end

u1 = User.new
u1.extend Seller
u1.respond_to? :sellers # => true

u2 = User.new
u2.respond_to? :sellers # => false
于 2012-06-11T12:09:37.210 に答える