Ruby on Rails: attr_accessor для подмоделей - PullRequest
1 голос
/ 10 апреля 2010

Я работаю с некоторыми моделями, в которых многие ключевые атрибуты данной модели фактически хранятся в подмодели.

Пример:

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 имеет очень мало. Тем не менее, мне часто приходится обращаться к полям 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 Ответ

6 голосов
/ 10 апреля 2010

Термин «подмодель» отбросил меня, потому что это нестандартная терминология, но я думаю, что вы ищете, это делегат . По сути, он позволяет делегировать определенные вызовы метода свойству или экземпляру метода объекта.

В этом случае вы бы сделали что-то вроде этого:

class WikiArticle
  has_many :revisions
  has_one :current_revision, :class_name => "Revision", :order => "created_at DESC"

  delegate :description, :to => :current_revision
end

Вы можете сделать это для любого количества методов, например, как ::100100

delegate :description, :title, :author, :to => :current_revision
...