0


0

関連付けテーブルの列で並べ替えられた結果のクエリ、最新の関連付けのみ

次のスキーマが与えられた場合

class User
  has_many :page_views
  #[id]
end

class Page
  has_many :page_views
  #[id]
end

class PageView
  belongs_to :user
  belongs_to :page
  #[id, created_at, updated_at]
end

どのようにして特定のページ、すべてのユーザーがcreated_atの日付順に最新のページビューを照会できますか? ユーザーごとに1行。最新のビューのみを表示します。

2 Answer


1


特定のpage_idの各user_idに対して最大のcreated_atを持つPageViewsが必要です。 これは、SQLでのこのクエリの表現です。

SELECT max(created_at) AS last_visit, page_views.*
FROM page_views
WHERE (page_id = 1)
GROUP BY user_id
ORDER BY last_visit DESC

Rails 3では、次のように記述できます。

Page.first.page_views.group(:user_id).select('max(created_at) AS last_visit, page_views.*').order('last_visit DESC')


1


これを試して:

class Page
  has_many :page_views
  has_many :recent_page_views, :class_name => "PageView",
    :joins => "INNER JOIN (
      SELECT     a.id, COUNT(*) AS ranknum
      FROM       page_views AS a
      INNER JOIN page_views AS b ON a.user_id = b.user_id AND
                                    a.page_id = b.page_id AND
                                    a.created_at <= b.created_at
      GROUP BY   a.id
      HAVING COUNT(*) = 1
    ) AS d ON (page_views.id = d.id)",
    :order => "page_views.created_at"

 has_many :recent_viewers, :through => :recent_page_views,
            :source => :user, :order => "page_views.created_at"
end

Now

page.recent_viewers