1

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

例子:

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 的上下文中访问修订的字段。最重要的案例可能是创建文章。我一直在用很多看起来像这样的方法来做到这一点,每个字段一个:

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

4

1 回答 1

6

术语“子模型”让我失望,因为它是非标准术语,但我认为您正在寻找的是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
于 2010-04-09T20:46:05.440 回答