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
Звучит неплохо?
Ответы
Ответ 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