![](/img/trans.png)
[英]When using class_eval in ruby, how to access the constant in the original class?
[英]How do you pass self to class_eval in ruby?
我正在做一個元編程任務,在這里我試圖使用一種方法在調用類中定義多態關聯,同時在目標類中定義關聯。 我需要傳遞調用類的名稱來獲得正確的關聯。 這是一個片段,應該可以使您理解:
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=
行,但不知道如何class_eval
self
的引用從調用類傳遞給class_eval
。
有什么建議么?
字符串參數將在當前上下文中解釋,因此您可以在其中自由調用self.name
或直接name
:
SomeClass.class_eval "has_many :#{name.tableize}, :through=>:join_models"
如果不是使用塊而是對字符串進行評估,請注意class_exec
是class_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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.