Ограничение комментариев по индексу сообщений в приложении Rails - PullRequest
0 голосов
/ 12 апреля 2011

Я новичок в rails и пытаюсь ограничить количество комментариев, отображаемых на моей индексной странице постов, до 2.

Ниже мой posts_controller:

class PostsController < ApplicationController

  before_filter :authorize, :except => [:index, :show]

  # GET /posts
  # GET /posts.xml
  def index
    @posts = Post.all(:include => :comments, :order => "created_at DESC")
    @comments = Comment.find(:all, :order => "created_at DESC", :limit => 1)

    respond_to do |format|
      format.html # index.html.erb
      format.xml  { render :xml => @posts }
    end
  end

  # GET /posts/1
  # GET /posts/1.xml
  def show
    @post = Post.find(params[:id])

    respond_to do |format|
      format.html # show.html.erb
      format.xml  { render :xml => @post }
    end
  end

  # GET /posts/new
  # GET /posts/new.xml
  def new
    @post = Post.new

    respond_to do |format|
      format.html # new.html.erb
      format.xml  { render :xml => @post }
    end
  end

  # GET /posts/1/edit
  def edit
    @post = Post.find(params[:id])
  end

  # POST /posts
  # POST /posts.xml
  def create
    @post = Post.new(params[:post])

    respond_to do |format|
      if @post.save
        format.html { redirect_to(@post, :notice => 'Post was successfully created.') }
        format.xml  { render :xml => @post, :status => :created, :location => @post }
      else
        format.html { render :action => "new" }
        format.xml  { render :xml => @post.errors, :status => :unprocessable_entity }
      end
    end
  end

  # PUT /posts/1
  # PUT /posts/1.xml
  def update
    @post = Post.find(params[:id])

    respond_to do |format|
      if @post.update_attributes(params[:post])
        format.html { redirect_to(@post, :notice => 'Post was successfully updated.') }
        format.xml  { head :ok }
      else
        format.html { render :action => "edit" }
        format.xml  { render :xml => @post.errors, :status => :unprocessable_entity }
      end
    end
  end

  # DELETE /posts/1
  # DELETE /posts/1.xml
  def destroy
    @post = Post.find(params[:id])
    @post.destroy

    respond_to do |format|
      format.html { redirect_to(posts_url) }
      format.xml  { head :ok }
    end
  end
end

Ниже моя модель сообщения

Класс Post

has_attached_file: photo,: styles => {: medium => "600x600>",: thumb => "100x100>"},: storage =>: s3,: s3_credentials => "# {RAILS_ROOT} /config/s3.yml",: path => "/: вложение /: id /: style /: filename"

has_many:комментарии

проверяет: имя,: присутствие => истина проверяет: заголовок,: присутствие => истина,: длина => {: минимум => 5}

конец

Ниже приведен индекс моих сообщений

<table>
  <tr>
     <th>BoxScore</th>
   <th>Content</th>
  </tr>
</table>

<% @posts.each do |post| %>
    <%= image_tag post.photo.url(:medium), :class =>"floatleft" %>
    <p>
  <%= post.content %>
    </p>
    <div class="comments center">
    <h3>Comments:</h3>
        <%= render :partial => post.comments.reverse %>
   <div class="links">
    <% if admin? %>
        <%= link_to "New Post", new_post_path %>
        <%= link_to 'Edit', edit_post_path(post) %>
    <%= link_to 'Destroy', post, :confirm => 'Are you sure?', :method => :delete %>
    <% end %>
    <%= link_to 'Comment on the Game', post %>
    </div>
</div>
<% end %>

</div>

Комментарии Частично Ниже

<% div_for comment do %>
    <p>
        <strong>Posted <%= time_ago_in_words(comment.created_at) %> ago
        </strong>
                by
                <br/>
                <%= h(comment.commenter) %>
                <br/>
        <%= h(comment.body) %>
                <br/>
                <%= link_to 'More Comments', comment.post %>
    </p>
<% end %>

Я не получаю сообщение об ошибке, я просто не знаю, как ограничить количествокомментарии, которые мы отображаем на странице индекса сообщений.Спасибо

1 Ответ

1 голос
/ 12 апреля 2011

К сожалению, вы не можете указать условия для загруженных ассоциаций. Кроме того, вы не можете ограничивать количество строк, возвращаемых в зависимости от условия (насколько я знаю, хотя о функциях SQL я многое не знаю).

Итак, вы застряли с:

  1. Загрузите все комментарии к сообщениям, отображаемым в запросе, и ограничьте число, отображаемое в приложении.
  2. Загружайте только 2 комментария для каждого отображаемого сообщения индивидуально .

Оптимальное решение зависит от вашего варианта использования. Если вы ожидаете показать только 5 сообщений и иметь тысячи комментариев к каждому, вариант 1 может быть не очень эффективным, а вариант 2 может быть хорошим решением. Если вы ожидаете показывать больше постов на странице и иметь только несколько комментариев по любому из них (более вероятный сценарий), лучшим вариантом будет первый вариант.

Вариант 1

# controller
@posts = Post.limit(20).all
@comments = Comment.find(@posts.collect &:id).group_by &:post_id

# view
<% @comments[@post.id].first(2).each do |comment| %>
  ...
<% end %>

Вариант 2

# controller
@posts = Post.limit(5).all

# view
<% post.comments.limit(2).each do |comment| %>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...