0

私には一連のユーザーがいて、それぞれが多数の投稿を行っています(そして、投稿は「ビュー」を受け取ります)。これまで、さまざまな方法でそれらを並べ替えてきました。

たとえば、最も閲覧された8人のユーザーは次のとおりです。

@most_viewed = User.sort_by{|user| user.views}

そして、私のモデルでは、user.rbファイル:

def views
    self.posts.sum(:views) || 0
end

これは過去にうまく機能しました。

問題は、私のソートでsort_byメソッドを使用したことです。これは、RelationではなくArrayを返すため、will_paginategemではうまく機能しません。

Rails 3、Active Record Relation、Lazy Loadingスタイルで次のことを行うにはどうすればよいですか?たとえば、名前付きスコープとして?

  • 少なくとも1つの投稿があるユーザー
  • 投稿の合計視聴回数が最も多いユーザー
  • 閲覧数が最も多い投稿を持つユーザー(合計ではない)
  • 最新の投稿を持つユーザー
  • 投稿数が最も多いユーザー
4

1 に答える 1

1

配列をページ分割することはできますが、'will_paginate / array'が必要になります。これを行うには、config / initializersディレクトリにファイル(つまり、 "will_paginate_array_fix.rb")を作成できます。これをそのファイルの唯一の行として追加します。

require 'will_paginate/array'

サーバーを再起動すると、通常のrubyアレイをページ分割できるはずです。

注文方法を使用する必要があります。これにより、SQLによる並べ替えが実行され、そもそもパフォーマンスが向上します:)

User.order("users.views DESC")

または昇順の場合

User.order("users.views ASC")

これによりリレーションが返されるため、where句、スコープなどの他のものを追加できます。

User.order("views DESC").where("name like 'r%'")

名前がrで始まるユーザーの順序付きリストの場合

公式の説明については、 http: //guides.rubyonrails.org/active_record_querying.htmlにアクセスしてください。

于 2013-01-26T00:32:47.697 に答える