article_controller.rb
def index
@articles = Article.all
end
статьи/index.html.erb
<% @articles.each do |article| %>
comments in article <%= article.comments.count %>
<% end %>
Вложенные маршруты (комментарии внутри статей) имеют большее значение с точки зрения создания/удаления маршрутов для комментариев. Также не забудьте добавить accepts_nested_attributes_for :comments
в свою модель статьи. Это позволит вам делать такие вещи:
например, в article_controller.rb
def show
@article = Article.find(params[:id])
# creates a new comment object with atricle_id already initialized
@comment = @article.comments.build
end
Изменить
Если вы начнете заботиться о производительности, я согласен с комментарием Китто.
Добавьте эту миграцию:
class AddCommentsCountToArtices < ActiveRecord::Migration
def change
add_column :articles, :comments_count, :integer, null: false, default: 0
end
end
И измените объявление отношения в модели комментариев на следующее:
belongs_to :article, counter_cache: true
Затем вы можете делать такие вызовы, как article.comments_count
, чтобы получить количество вместо atricle.comments.count
. И прекрасно, если счетчик равен 0, потому что он даже не выполняет запрос (стр. 195 в The Rails 3 Way).
Если вам интересно, как работает counter_cache: он добавляет обратный вызов в соответствующий класс (в данном случае класс Comment), который обновляет атрибут comments_counter в родительской статье каждый раз, когда комментарий создается или уничтожается.
Кроме того, функциональность counter_cache может быть легко добавлена в существующие базы данных как продемонстрировано здесь, автором которого является Оби Фернандес.
person
anxiety
schedule
29.08.2012