2

ここで基本的なレポートを作成しようとしています

  • 名前、年齢などの詳細を含むユーザーのリストを表示します。
  • 投稿数、前回の活動時間などのその他の詳細も表示します。
  • これらの他のすべての詳細は、ユーザーからの has_many 関係にあります

これは私が今していることです:

User.find(
          :all, 
          :select => "users.id, users.name, count(distinct(posts.id)) as posts_count",
          :joins => "left outer join posts on posts.user_id = users.id",
          :group => "users.id",
          :limit => "100"
)

posts テーブルのuser_id列にインデックスを作成しました

私の問題は、これを行うのに非常に時間がかかり、アクティビティやコメントなどの投稿と一緒にテーブルを追加しようとするとハングすることがあります.

カウントだけに参加する方法、またはこれを達成するための他の方法はありますか?

前もって感謝します

4

1 に答える 1

1

これらのいずれかが機能すると思いますが、いつものように外部結合を行うと、クエリが遅くなります。

User.count(:include=>[:posts])

User.count(:select => "users.id, users.name, count(distinct(posts.id)) as posts_count",
          :joins => "left outer join posts on posts.user_id = users.id",
          :group => "users.id")

User.find(:all, :include => [:posts])

また、これを初期化ファイルまたはirbrcファイルに入れることもできます:

ActiveRecord::Base.logger = Logger.new(STDOUT)
ActiveRecord::Base.clear_active_connections!

コンソールに入力するときにクエリを確認します。

投稿数について

User.all.posts.size

後で各投稿数を報告する限り、既に持っている User レコードでそれを行うことができます。

@users = User.find(:all, :include=> [:posts])

後で ...

<% @users.each do |user|
  Posts: <%= user.posts.size %>
<% end %>

投稿ごとに並べ替えられたユーザー

@sorted_users = @users.sort_by{|user| user.posts.size }

https://stackoverflow.com/a/5739222/1354978

于 2012-09-25T05:56:03.273 に答える