Где поместить кусок кода в Ruby on Rails? - PullRequest
1 голос
/ 02 июня 2010

У меня есть пост-контроллер, который имеет много комментариев. Модель поста имеет поле has_comments, которое является логическим (поэтому я могу быстро выбирать из базы данных только посты с комментариями). Чтобы создать новый комментарий к сообщению, я использую действие create моего контроллера комментариев.

После создания комментария мне нужно обновить поле has_comments в моем сообщении и установить его на true.

Я могу обновить это поле из действия create моего контроллера комментариев, но это кажется неправильным - я чувствую, что мне действительно следует использовать действие update, но я не уверен, что право вызывать его (через send?) из действия create контроллера комментариев.

Где должен быть код для обновления поста? Спасибо!

Ответы [ 3 ]

2 голосов
/ 02 июня 2010

Зачем загромождать вашу базу данных другим столбцом, если интерфейс программный? Сделайте has_comments методом на Пост:

def has_comments
  comments.size > 0
end

Затем реализуйте counter_cache, как предложено, чтобы уменьшить нагрузку на запрос.

РЕДАКТИРОВАТЬ: в качестве альтернативы, после внедрения счетчика кэша, вы можете использовать named_scope в публикации, чтобы получить все сообщения с комментариями, используя один запрос, если это главная цель:

* +1007 *

РЕДАКТИРОВАТЬ: Вы также можете избежать знаменитой проблемы с n + 1 запросом, используя грамотно: include:

posts = Post.find(:all, :include => :comments)
1 голос
/ 02 июня 2010

использовать after_save в модели комментария

def after_save
  #this will set "has_comment" of the Specified Post to true if it's not true already
  self.post.update_attribute('has_comment', true) unless self.post.has_comment
end
1 голос
/ 02 июня 2010

Вы можете использовать обратный вызов before_save в вашей модели.

Еще лучшим способом было бы использование встроенной опции: counter_cache, которая автоматически кэширует количество комментариев для каждого поста. (см. http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html#M001835 в разделе параметров для принадлежащих_ *)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...