Rails查询以根据关联资源返回不同的资源

时间:2016-11-22 07:31:40

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

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

我已经设置了这些模型

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 }
)

如果用户在多个最近的广播中使用过它们,则会多次返回单个标签。我想只收到不同的标签。如果我只是打电话给那个当然可以正常工作。

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

1 个答案:

答案 0 :(得分:0)

经过一些搜索,头脑刮擦和文档阅读后,我意识到我可以做到这一点

希望它可以帮助其他人

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')