如何获取保存在实例变量中的模型的属性

时间:2011-01-12 14:52:25

标签: ruby-on-rails activerecord ruby-on-rails-3

我正在编写一个插件,我在插件中动态定义一个新的关系。示例代码如下所示

module AttachDocumentsAs
   @as = nil
   def attach_documents_as(*attachment_as)
      attachment_as = attachment_as.to_a.flatten.compact.map(&:to_sym)
      @as           = attachment_as.first
      class_inheritable_reader(@as)

      class_eval do
          has_many @as, :as => :attachable, :class_name=>"AttachDocuments::Models::AttachedDocument"
          accepts_nested_attributes_for @as
      end 
   end
end

现在在我用它的任何模型中

class Person < AtiveRecord::Base
    attach_documents_as :financial_documents
end

现在想要访问想要在重载的初始化方法中访问该类的这个属性,就像这样

def initialize(*args)
   super(*args)
   "#{@as}".build 
end

但它没有得到必需的属性,任何人都可以帮助我。我想建立这种关系并设置一些初始值。

等待所有人的指导。

1 个答案:

答案 0 :(得分:0)

您可能会混淆@as类实例变量(仅适用于Person的类方法)和@as实例变量(仅适用于此类的实例)。我知道,即使这个解释听起来有点复杂。

每个对象都有实例变量,而类只是一种对象。此类的实例也是对象,它们具有自己的独立实例变量。要从类的实例中获取类实例变量,您需要一个读者方法,就像您定义的那样。也许你的意思是:

def initialize(*args)
  super(*args)

  # self.class.as returns something like :financial_documents, so use this method
  # to return a scope to build in.
  send(self.class.as).build
end

您使用@as的方式表明您已经习惯了像PHP或Perl这样的东西,您可以像${$as}那样取消引用它。在Ruby中,您通常从字符串或符号中取消引用到类或方法中。

看起来您正在尝试将符号转换为方法调用,而这是通过send完成的。

如果您尝试将字符串转换为类,则在String上使用constantize方法,这是Rails环境的一项功能。