代码之家  ›  专栏  ›  技术社区  ›  klochner

你如何用ruby把self传给class\u eval?

  •  2
  • klochner  · 技术社区  · 16 年前

    
    class SomeClass &lt ActiveRecord::Base
        has_many :join_models, :dependent=>:destroy
    end
    
    class JoinModel &lt 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

    有什么建议吗?

    1 回复  |  直到 16 年前
        1
  •  5
  •   Marc-André Lafortune    16 年前

    字符串参数将在当前上下文中解释,因此您可以自由调用 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的新版本,所以您需要 require 'backports/1.8.7' 如果在1.8.6中。

    注意:我假设您需要求值,因为在您的特定示例中,您可以直接调用该方法,不是吗?

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