我正在尝试根据用户查看位置的次数来订购位置列表。我为了它而使用印象派宝石。
我遇到的问题是我的查询完全排除了用户从未查看过的位置。我需要在结果的底部显示这些内容,并按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")
哪个更好但是省略了那些零视图的位置。
我该怎么做才能获得所有位置?
答案 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")