0

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

我遇到的问题是我的查询完全排除了用户从未查看过的那些位置。我需要在结果的底部显示这些,并按 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")

哪个更好,但它忽略了那些视图为零的位置。

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

4

1 回答 1

0

默认情况下,Railsinner join在你使用.joins. 这就是您看不到没有相关展示的位置的原因。您需要告诉它使用 aleft 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")
于 2013-06-12T18:36:15.767 回答