我正在编写一个插件,我在插件中动态定义一个新的关系。示例代码如下所示
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
但它没有得到必需的属性,任何人都可以帮助我。我想建立这种关系并设置一些初始值。
等待所有人的指导。
答案 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环境的一项功能。