Ruby on Rails:子模型的attr_accessor

时间:2010-04-09 20:30:26

标签: ruby-on-rails attr-accessor

我正在使用一些模型,其中许多给定模型的关键属性实际存储在子模型中。

示例:

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一样自动创建所有这些方法?

1 个答案:

答案 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