在运行时扩展对象时,如何调用类方法?

时间:2012-06-11 12:02:54

标签: ruby ruby-on-rails-3

我想在运行时扩展一个对象(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类中,我想扩展单个用户对象的行为,而不是所有用户对象。

1 个答案:

答案 0 :(得分: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