Получение модели, это количество ассоциаций и одна ассоциация в рельсах - PullRequest
0 голосов
/ 04 марта 2019

Я пытаюсь отобразить несколько популярных колбов в приложении, а также показываю количество лайков (коллаборации-ассоциации, где «статус» равен 2), и нравится ли текущему пользователю это или нет (на основестатус в ассоциации сотрудничества для запрашивающего пользователя).

У меня есть следующие модели:

Collab:
- has_many :collaborations

Collaboration:
- belongs_to :collab
- belongs_to :user

User:
- has_many :collaborations

Что я хочу получить в результате запроса ниже, это:

Массив из 10 объектов-коллабов, где объекты-коллабов содержат:

  • Like_count всех ассоциаций, для которых статус равен 2.
  • И объект сотрудничества, связанный сзапрашивающий пользователь (params [: user_id]).ИЛИ просто статус совместной ассоциации.Мне нужен только атрибут 'status'.

PS: пользователю может понравиться коллаж только один раз, поэтому у коллаба будет только одна ассоциация сотрудничества от каждого пользователя.

Это то, что у меня сейчас.Это дает мне десять коллабораций и количество ассоциаций.Я не уверен в том, как включить только атрибут Сотрудничество / Сотрудничество с предоставленным идентификатором пользователя.

1 Ответ

0 голосов
/ 04 марта 2019
Collab:
- has_many :collaborations
- has_many :users, :through => :collaborations

Collaboration:
- belongs_to :collab
- belongs_to :user

User:
- has_many :collaborations
- has_many :collabs, :through => :collaborations

(Как включить только атрибут совместной работы / взаимодействия с помощью предоставленного идентификатора пользователя.) -

popular_collabs = Collab
                      .left_outer_joins(:collaborations, :users, :reports)
                      .select("collabs.*, SUM(CASE WHEN collaborations.status = 2 THEN 1 ELSE 0 END) as like_count")
                      .where(users: {id: params[:user_id]})
                      .where(reports: {id: nil})
                      .where("collabs.deadline >= ?", Date.today)
                      .group(:id)
                      .order('like_count DESC')
                      .limit(10)

или

popular_collabs = Collab
                      .left_outer_joins(:collaborations, :reports)
                      .select("collabs.*, SUM(CASE WHEN collaborations.status = 2 THEN 1 ELSE 0 END) as like_count")
                      .where("collaborations.user_id = ?", params[:user_id])
                      .where(reports: {id: nil})
                      .where("collabs.deadline >= ?", Date.today)
                      .group(:id)
                      .order('like_count DESC')
                      .limit(10)
...