1

私はPost、、ReplyおよびVoteモデル(多形)を持っています:

 create_table "posts", :force => true do |t|
    t.text     "content",       :limit => 255
    t.integer  "user_id"
    t.datetime "created_at",                                  :null => false
    t.datetime "updated_at",                                  :null => false
    t.string   "title"
    t.integer  "replies_count",                :default => 0, :null => false
    t.integer  "category_id"
  end

  create_table "replies", :force => true do |t|
    t.text     "content"
    t.integer  "post_id"
    t.integer  "user_id"
    t.datetime "created_at", :null => false
    t.datetime "updated_at", :null => false
  end

  create_table "votes", :force => true do |t|
    t.integer  "votable_id"
    t.string   "votable_type"
    t.integer  "user_id"
    t.integer  "polarity"
    t.datetime "created_at",   :null => false
    t.datetime "updated_at",   :null => false
  end

投稿と返信が必要だったtotal_votesので、インスタンスメソッドを作成しました。

post.rbおよびreply.rb:

  def total_votes
    self.votes.map {|v| v.polarity }.sum
  end

だから私はそれを使って投稿や返信を並べ替えることができます:

ホームページ:

 default_order = "created_at DESC"
 params[:order_by] ||= default_order
 @feed_items = @post.replies.paginate(page: params[:page],
                                      per_page: 10).order(params[:order_by])

だから今、私はorder_byビューの後に何を追加するのかよくわかりません:

  <span><%= link_to 'total_votes DESC', root_path(order_by: HERE) %></span>

試しましたが、うまく&:total_votes DESCいきtotal_votes DESCませんでした。

これを行う正しい方法は何ですか?(とテーブルのtotal_votes両方に列を追加する必要は少しないと思いましたが、それがパフォーマンスに優れているかどうかはわかりませんか?)postsreplies

4

1 に答える 1

2

データベースを使用して合計を行うことから始めますが、計算された値(「集計」)で並べ替える必要があるため、これは少し注意が必要ですが、それは別にしてみましょう。

ビューには、インスタンス変数がコントローラーに設定されたときに決定された順序でアイテムが表示されます。したがって、コントローラーでは、パラメーターがあることを検出できorder_byます(たとえば、それに応じ/feed?order_by=total_votesてロードします。たとえば、@feed_items

def index
  if params[:order_by] && params[:order_by] == 'total_votes'
    sort_order = "total_votes DESC"
  else
    sort_order = "created_at DESC"
  end
  @feed_items = @post.replies.paginate(page: params[:page],
                                  per_page: 10).order(sort_order)
end

次に、ビューで、並べ替え順序を変更link_toするには、クエリ文字列パラメーターを追加するを作成します(link_to api docの最後の例を参照してください。例:

<%= link_to "Sort by Total Votes", root_path(:order_by => 'total_votes') %><br />
<%= link_to "Sort by Time", root_path %><br />

もう1つの質問は、投票による並べ替えの方法についてです。この回答は、そのための良いスタートと、パフォーマンスに関する質問への回答を提供する可能性があります。Rails:2つの列の合計で並べ替える

于 2012-12-04T13:56:21.860 に答える