2016-11-22 109 views
0

我需要收集用戶最近的廣播標記。Rails查詢返回基於關聯資源的不同資源

我有這些模型建立

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') WH ICH抱怨for SELECT DISTINCT, ORDER BY expressions must appear in select list

回答

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