【问题标题】:Rails query to return distinct resources based on associated resourceRails 查询根据关联资源返回不同的资源
【发布时间】:2016-11-22 07:31:39
【问题描述】:

我需要收集用户最近的广播标签。

我已经设置了这些模型

class Broadcast < AR::Base
  belongs_to :user
  has_many :broadcast_tags
  has_many :tags, through: :broadcast_tags
end

class Tag < AR::Base
  has_many :broadcast_tags
  has_many :broadcasts, through: :broadcast_tags
end

class BT < AR::Base
  belongs_to :broadcast
  belongs_to :tag
end

我想从上个月的用户广播中查找标签

我想我需要加入广播来标记,然后找到这些广播中使用的所有标签

Tag.joins(:broadcasts).where(
  broadcasts: { user_id: current_user.id, created_at: Time.current.all_month }
)

如果用户在多个最近的广播中使用了单个标签,这会多次返回它们。我只想收到不同的标签。如果我只是调用 distinct,哪个当然可以。

Tag.joins(:broadcasts).where(
  broadcasts: { user_id: current_user.id,   created_at: Time.current.all_month }
).distinct

我还需要按照它们在广播中出现的顺序对这些不同的标签进行排序。

如果

  • 最后一个广播有标签10、9、6、1
  • 倒数第二个有标签 9、2、1

我希望标签按此顺序退回

10、9、6、1、2

我试过.order('broadcasts.created_at DESC') 抱怨for SELECT DISTINCT, ORDER BY expressions must appear in select list

【问题讨论】:

    标签: sql ruby-on-rails postgresql sql-order-by distinct


    【解决方案1】:

    经过更多的搜索、挠头和文档阅读后,我意识到我可以做到这一点

    希望它可以帮助别人

    Tag.joins(:broadcasts).where(
      broadcasts: { user_id: user.id, created_at: Time.current.all_month }
    ).group('tags.id, tags.name').order('max(broadcasts.created_at) DESC')
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-08-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多