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