2010-04-09 21 views
2

我正在進行元編程任務,在那裏我嘗試使用單個方法來定義調用類中的多態關聯,同時還要定義目標類中的關聯。我需要傳入呼叫類的名稱來獲得關聯權。這裏有一個片段,它應該傳達出的理念:如何在ruby中將自我傳遞給class_eval?


class SomeClass < ActiveRecord::Base 
    has_many :join_models, :dependent=>:destroy 
end 

class JoinModel < ActiveRecord::Base 
    belongs_to :some_class 
    belongs_to :entity, :polymorphic=>true 
end 

module Foo 
module ClassMethods 
    def acts_as_entity 
     has_many :join_models, :as=>:entity, :dependent=>:destroy 
     has_many :some_classes, :through=>:join_models 

     klass = self.name.tableize 
     SomeClass.class_eval "has_many :#{klass}, :through=>:join_models" 
    end 
    end 
end 

我想消除klass=線,但不知道怎麼回事參考從調用的類傳遞給selfclass_eval

有什麼建議嗎?

回答

5

的字符串參數將在當前的背景下進行解釋,所以你可以自由地調用self.name那裏,或者直接name

SomeClass.class_eval "has_many :#{name.tableize}, :through=>:join_models" 

如果不是在一根繩子上做一個eval你使用的是塊請注意,class_execclass_eval上的一個變體,它允許您自然傳遞參數。所以:

SomeClass.class_exec(name.tableize.to_sym) do |klass| 
    has_many klass, :through=>:join_models 
end 

它是1.8.7的新手,所以如果在1.8.6中需要require 'backports/1.8.7'

注意:我假設您需要評估所有,因爲在您的特定示例中,您可以直接調用該方法,否?

SomeClass.has_many name.tableize.to_sym, :through=>:join_models 
+0

很好的答案,我學到了一些新的技巧 - 謝謝。你的「註釋」是更好的解決方案 - 我忽略了調用SomeClass.has_many,但瞭解class_exec也很有幫助。 – klochner 2010-04-09 17:05:24

相關問題