如何获得独特的多态关联

时间:2018-12-21 07:12:04

标签: sql ruby-on-rails ruby database postgresql

我试图显示一个多态关系列表,而没有任何重复。

我有一个StoreViews表,其中包含一个称为viewable的多态字段(因此表中有viewable_id和viewable_type列)。现在,我想显示每个多态关系仅显示一次且没有重复的视图。

@views = StoreView.
    .distinct(:viewable_id)
    .distinct(:viewable_type)
    .order("created_at DESC")
    .limit(10)

因此,如果StoreViews中有两条记录,它们都具有相同的可视关系,则@views应该只返回最新的一条。但是,事实并非如此。

3 个答案:

答案 0 :(得分:6)

如果指定了ORDER BY,则

SELECT DISTINCT项目必须出现在选择列表中。 work around this issue有几种方法。

在此示例中,应使用聚合函数:

@views = StoreView
           .select('DISTINCT viewable_type, viewable_id, MAX(created_at)')
           .group(:viewable_type, :viewable_id)
           .order('MAX(created_at) DESC')
           .limit(10)

答案 1 :(得分:6)

distinct仅接受布尔值作为参数,以指定记录是否唯一。因此,distinct(:viewable_id)等效于distinct(true)而不执行您想要的操作。您应该使用group而不是使用distinct,它会根据group属性返回一个包含不同记录的数组。要返回最新的字段,除了要按created_atgroup进行排序(用order进行排序之外,您还需要在@views = StoreView .order(viewable_id: :desc, viewable_type: :desc, created_at: :desc) .group(:viewable_id, :viewable_type) 中添加字段:

created_at

如果您需要按{{1}}对返回的记录进行排序,则需要添加它。

答案 2 :(得分:0)

ActiveRecord不同:

https://apidock.com/rails/ActiveRecord/QueryMethods/distinct

  

指定记录是否应该唯一。例如:

User.select(:name)
# => Might return two records with the same name

User.select(:name).distinct
# => Returns 1 record per distinct name

如何?

@views = StoreView
    .select(:viewable_id, :viewable_type)
    .distinct
    .order("created_at DESC")
    .limit(10)

您也可以尝试

@views = StoreView
    .select('DISTINCT `viewable_id`, `viewable_type`')
    .order("created_at DESC")
    .limit(10)