如何从类方法设置实例变量?

时间:2010-11-20 16:50:21

标签: ruby-on-rails ruby activerecord

我正在尝试自定义活动记录宏。但现在似乎不可能从它的块中设置一个实例变量..这就是我想要做的。

module ActiveRecord
   class Base
      def self.included(base)
         base.class.send(:define_method, :my_macro) do |args|
            # instance_variable_set for the model instance that has called this 
            # macro using args
         end
      end
   end
end

我尝试了class_eval,instance_eval ..但似乎没有任何效果,或者我不知道如何使用它们。

提前致谢。

修改:让我试着更好地解释一下。我有一个班级方法。该类的实例调用此方法。现在,这个类方法应该指示实例为自己设置一个实例变量。

编辑 - 这就是我想要使用宏

的方式
class MyModel < ActiveRecord::Base
   my_macro(*args)
   def after_initialize
      # use the value set in the macro as @instance variable
   end
end

2 个答案:

答案 0 :(得分:0)

这是你在想什么:

class DynamicAdd
  def add_method
    self.class_eval do
      attr_accessor :some_method
    end
  end
end

然后您可以执行以下操作:

k = DynamicAdd.new
k.some_method = "hi"

会导致未定义的方法错误。

但是,

k = DynamicAdd.new
k.add_method
k.some_method = "hi"

应该有用。

除了attr_accessors之外,您还可以使用相同的格式来定义其他类型的方法:

class DynamicAdd
  def add_method
    self.class_eval do
      def some_method
        return "hi"
      end
    end
  end
end

答案 1 :(得分:0)

Hm ..是不是包含()一个模块方法?我认为你不能像你写的那样在课堂上使用它。如果你想创建一个类方法,你可以做

class Base
  def self.my_method
  end

class Base
  class << self
    def my_method
    end
  end

如果您只想将实例变量添加到现有对象,那么您可以使用#instance_variable_set

class Base
  class << self
    def my_method(instance_of_base, value)
      instance_of_base.instance_variable_set "@x", value
    end
  end
end

a = Base.new
a.class.send(:my_method, *[a,4])