簡體   English   中英

您如何將自己傳遞給紅寶石中的class_eval?

[英]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_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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM