Rails Count Сколько статей

Я пытаюсь показать в article#index, сколько комментариев к каждой статье.

Итак, у меня есть следующие модели

resources Article do
 resources Comments do
 end
end

Я знаю, что в каждой статье я могу сделать следующее, и это сработает:

@count = @article.comments.find(:all).count

И просто показать в счетчике просмотров. Но затем возникает проблема, когда я нахожусь в индексном файле и не знаю, как показать, сколько комментариев существует для этого события.

заранее спасибо


person Jseb    schedule 29.08.2012    source источник
comment
Я бы настоятельно рекомендовал использовать для этого кеш-счетчик, так как это может создать большую нагрузку на стороне SQL. Посмотрите этот эпизод на RailsCasts, чтобы узнать, как это делается: railscasts.com/episodes/23-counter -cache-column   -  person Kitto    schedule 29.08.2012
comment
Комментарий Китто должен быть опубликован как ответ и должен быть принят как правильный ответ.   -  person Chris Peters    schedule 29.08.2012


Ответы (3)


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

В article#index вы можете просмотреть переменную экземпляра, содержащую все статьи. Ваше представление должно выглядеть примерно так:

@articles.each do |article|
  article.name
  .
  .
  article.comments.count
end
person Josh Moore    schedule 29.08.2012

@article.comments 

даст все комментарии к @статье. Вам не нужно указывать, как показано ниже

@article.comments.find(:all)

для отображения количества комментариев к каждой статье выполните

%table
  %thead
  %tbody
    - @articles.each do |article|
      %tr
      = article.comments.count

вид в хамле

person prasad.surase    schedule 29.08.2012