2016-11-22 1 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') ВГ ич жалуется 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') 
Смежные вопросы