我正在进行元编程任务,我正在尝试使用单个方法在调用类中定义多态关联,同时还定义目标类中的关联。我需要传入调用类的名称才能使关联正确。这是一个应该得到这个想法的片段:
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=
行,但不知道如何将对self
的引用从调用类传递到class_eval
。
有什么建议吗?
答案 0 :(得分:5)
字符串参数将在当前上下文中解释,因此您可以直接在那里调用self.name
,或直接调用name
:
SomeClass.class_eval "has_many :#{name.tableize}, :through=>:join_models"
如果不是对使用块的字符串执行eval,请注意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