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 のコンテキストからリビジョンのフィールドにアクセスしなければならないことがよくあります。これの最も重要なケースは、おそらく記事を作成する場合です。私は、フィールドごとに 1 つずつ、次のような多くのメソッドでそれを行ってきました。

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_accessor のようにすべてのメソッドを自動的に作成できるように、attr_submodel_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 に答える