has_one,: through => модель VS простой метод? - PullRequest
12 голосов
/ 20 мая 2011

У меня есть некоторые проблемы с использованием 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

Все работает отлично.Я могу сделать 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

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

Ответы [ 2 ]

6 голосов
/ 22 мая 2011

Ничего плохого в твоей идее. Я не вижу много ситуаций, в которых 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 голосов
/ 20 мая 2011

Попробуйте внести изменения в свой класс категории, как это:

class Category
  has_many :articles
  has_many :comments, :through => :articles
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...