按用户查看页面的次数排序找到的集合

时间:2013-06-12 17:31:04

标签: ruby-on-rails-3

我正在尝试根据用户查看位置的次数来订购位置列表。我为了它而使用印象派宝石。

我遇到的问题是我的查询完全排除了用户从未查看过的位置。我需要在结果的底部显示这些内容,并按created_at时间戳排序。

我可以这样做以获取location_ids列表:

 @location_ids = @user.impressions.
   select('count(id) as counter, impressionable_id').
   group(:impressionable_id).
   order('counter DESC').

 @location_ids.map(&:impressionable_id)

其中[3,5,8,44,99]等等。

然而,这并没有让我走得太远,所以我尝试了这个:

 @user.locations.
  joins(:impressions).
  select("count(impressions.id) as counter, impressionable_id, locations.location_name, locations.id").
  group(:impressionable_id).
  order("counter desc")

哪个更好但是省略了那些零视图的位置。

我该怎么做才能获得所有位置?

1 个答案:

答案 0 :(得分:0)

默认情况下,当您使用inner join时,Rails会使用.joins。这就是为什么您没有看到没有相关印象的位置的原因。您需要告诉它使用left join,可能是这样的:

 @user.locations.
  joins("left join impressions on impressions.impressionable_id = locations.id and impressions.impressionable_type = 'Location'").
  select("count(impressions.id) as counter, impressionable_id, locations.location_name, locations.id").
  group('locations.id').
  order("counter desc")