2012-06-11 65 views
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類的模塊,我想延長單個用戶對象,而不是所有的用戶對象的行爲。

回答

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 
相關問題