首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何获得不同的多态关联

如何获得不同的多态关联
EN

Stack Overflow用户
提问于 2018-12-21 15:12:04
回答 3查看 646关注 0票数 6

我试图在没有任何重复的情况下显示多态关系的列表。

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

代码语言:javascript
复制
@views = StoreView.
    .distinct(:viewable_id)
    .distinct(:viewable_type)
    .order("created_at DESC")
    .limit(10)

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

EN

回答 3

Stack Overflow用户

发布于 2018-12-27 16:00:17

如果指定了ORDER BY,则SELECT DISTINCT项必须出现在选择列表中。有几种方法可以实现work around this issue

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

代码语言:javascript
复制
@views = StoreView
           .select('DISTINCT viewable_type, viewable_id, MAX(created_at)')
           .group(:viewable_type, :viewable_id)
           .order('MAX(created_at) DESC')
           .limit(10)
票数 6
EN

Stack Overflow用户

发布于 2018-12-27 18:48:01

distinct只接受布尔值作为参数来指定记录是否应该是唯一的。所以distinct(:viewable_id)等同于distinct(true),而不是做你想做的事情。您应该使用group而不是distinct,它根据group属性返回具有不同记录的数组。要返回最新的字段,除了按created_at排序(使用order)之外,还需要在group中添加字段

代码语言:javascript
复制
@views = StoreView
         .order(viewable_id: :desc, viewable_type: :desc, created_at: :desc)
         .group(:viewable_id, :viewable_type)

如果您需要按created_at对返回的记录进行排序,则需要添加以下内容。

票数 6
EN

Stack Overflow用户

发布于 2018-12-21 16:07:15

不同的ActiveRecord:

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

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

User.select(: name ) # =>可能返回两条具有相同名称的记录User.select(: name ).distinct # =>为每个不同的名称返回一条记录

这样如何:

代码语言:javascript
复制
@views = StoreView
    .select(:viewable_id, :viewable_type)
    .distinct
    .order("created_at DESC")
    .limit(10)

您也可以尝试

代码语言:javascript
复制
@views = StoreView
    .select('DISTINCT `viewable_id`, `viewable_type`')
    .order("created_at DESC")
    .limit(10)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53880608

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档