我正在使用一些模型,其中许多给定模型的关键属性实际存储在子模型中。
示例:
class WikiArticle
has_many :revisions
has_one :current_revision, :class_name => "Revision", :order => "created_at DESC"
end
class Revision
has_one :wiki_article
end
Revision类有很多数据库字段,WikiArticle很少。但是,我经常需要从WikiArticle的上下文访问Revision的字段。最重要的情况可能是创建一篇文章。我一直在这样做,有很多看起来像这样的方法,每个领域都有一个:
def description
if @description
@description
elsif current_revision
current_revision.description
else
""
end
end
def description=(string)
@description = string
end
然后在我的保存中,我将@description保存到新版本中。
这一切都让我想起了很多attr_accessor,只是看起来我不能让attr_accessor去做我需要的东西。我如何定义一个attr_submodel_accessor,这样我就可以给出字段名称并让它像attr_accessor一样自动创建所有这些方法?
答案 0 :(得分:6)
“submodel”一词让我失望,因为它是非标准的术语,但我认为你所寻找的是delegate。基本上,它允许您将某些方法调用委托给对象的属性或实例方法。
在这种情况下,你会做这样的事情:
class WikiArticle
has_many :revisions
has_one :current_revision, :class_name => "Revision", :order => "created_at DESC"
delegate :description, :to => :current_revision
end
您可以根据需要使用多种方法执行此操作,例如:
delegate :description, :title, :author, :to => :current_revision