Подтвердить что ты не робот

Has_one,: through => модель VS простой метод?

У меня есть некоторые проблемы с использованием has_one, through => model. Лучше всего показать вам мое дело.

class Category
  has_many :articles
end

class Article
  has_many :comments
  belongs_to :category
end

class Comment
  belongs_to :article
  has_one :category, :through => :articles
end

Everthing отлично работает. Я могу сделать comment.category. Проблема в том, что когда я создаю новый комментарий и настраиваю его статью, я сохранил комментарий, чтобы сделать работу ассоциации. Пример:

 >> comment = Comment.new
 >> comment.article = Article.last
 >> comment.category
     -> nil
 >> comment.article.category
     -> the category
 >> comment.save
 >> comment.category
     -> nil
 >> comment.reload
 >> comment.category
     -> the category

has_one, through => model в любом случае не настраивать, строить конструктор и метод создания. Итак, я хочу заменить мою модель комментариев на:

class Comment
  belongs_to :article
  def category
    article.category
  end
end

Звучит неплохо?

4b9b3361

Ответ 1

Ничего плохого в вашей идее. Я не вижу много ситуаций, в которых has_one :category, :through => :articles станет очевидным лучшим выбором (если только не загружать с помощью Comment.all(:include => :category)).

Подсказка delegate:

class Comment
  belongs_to :article
  delegate :category, :to => :article

Другой подход:

class Comment
  belongs_to :article
  has_one :category, :through => :article

  def category_with_delegation
    new_record? ? article.try(:category) : category_without_delegation
  end

  alias_method_chain :category, :delegation

Ответ 2

Попробуйте внести изменения в свой класс Category следующим образом:

class Category
  has_many :articles
  has_many :comments, :through => :articles
end