0

Rails アプリの非常に基本的な分析機能を作成しています。プロファイルを閲覧した訪問者の数をユーザーに示す統計を提供し、各訪問者が持つ特定の役割 (アプリで「rolify」を使用しています) に従ってそれらを分類したいと考えています。

Usersコントローラーのshowアクションで、これを行います

@profileviews = Profileview.where(:user_id => @user.id)
@profileviewsbysomerole = Profileview.where({:user_id => @user.id, :viewer_role => 'someRole'})
@profileviewsbysomeotherrole = Profileview.where({:user_id => @user.id, :viewer_role => 'someOtherRole'})

そして、ショーアクションで、私はやります

Your profile has been viewed <%= @profileviews.size %> times.
Your profile has been viewed by users with a particular role <%= @profileviewsbysomerole.size %> times.
Your profile has been viewed by users with some other role <%= @profileviewsbysomeotherrole.size %> times.

3 つの個別のクエリを作成せずに私がやろうとしていることを達成する方法はありますか、またはこれが (パフォーマンスを低下させないという点で) これらの統計を取得するための最良の方法ですか?

4

3 に答える 3

1

性能的にはOKだと思います。もう 1 つのオプションは、すべてのオブジェクトを照会してからメモリ内でフィルター処理することですが、これは良い考えではないと思います。データベースに最適な処理をさせるのが最善です。

頭に浮かぶことの 1 つ - 単一のクエリとgroup_byを使用して、2 番目と 3 番目の呼び出しを行わないようにすることもできますが、これは、集計データを取得しようとしている場合に関連します。

コーディング スタイルに関しては、さまざまなクエリのスコープを定義してビューから使用することもできますが、それはやり過ぎかもしれません。

于 2013-05-01T20:58:37.633 に答える
1

これらを一緒に使うことが多い場合は、次のようにまとめておくとよいでしょう。

# in user model
def profile_view_hash(*roles)
  views = { 'all' => Profileview.where(:user_id => id).all }
  roles.each do |role|
    views.merge!({
      role => Profileview.where(:user_id => id, :viewer_role => role).all
    })
  end
  views
end

これにより、次のように使用できるようになります。

# in controller
@profile_views = @user.profile_view_hash('someRole','someOtherRole')

# in view
<%= @profile_views['all'] %>
<%= @profile_views['someRole'] %>
<%= @profile_views['someOtherRole'] %>

ちなみに、あなたの例では、.size の出力のみを表示しています。それが必要な場合は、count代わりに使用する必要がありますall

于 2013-05-01T21:30:27.423 に答える