Имеет много сквозных ассоциаций

#ruby-on-rails #controller #has-many-through

#ruby-on-rails #контроллер #имеет много сквозных

Вопрос:

У меня есть две модели с ассоциацией has_many_through, например:

 class Workspace < ActiveRecord::Base
  has_many :dashboards_workspaces
  has_many :dashboards, through: :dashboards_workspaces
end
 
 class Dashboard < ActiveRecord::Base
  has_many :dashboards_workspaces
  has_many :workspaces, through: :dashboards_workspace
end
 

Когда я создаю панель мониторинга, у меня есть возможность выбрать одно или несколько рабочих пространств, и я могу получить панели мониторинга с таким рабочим пространством:

 Dashboard.joins(:workspaces).all
 

И я получаю идентификаторы рабочих пространств таким образом:

 foo = Dashboard.find(1)
foo.workspaces.id
 

Но мне нужно показывать в представлении только панели мониторинга, которые имеют тот же workspace_id, что и текущий пользователь:

 @workspaces = Workspace.where(id: current_user.workspaces)
 

Например:

 Workspace.where(id: current_user.workspaces) = [4]
Dashboard.find(1).workspaces.id = [1, 3]
Dashboard.find(2).workspaces.id = [4]
 

Мне нужно показывать только панель управления 2 в представлении.

Есть ли способ, которым я могу выполнить это, используя запрос в моем контроллере?

Большое вам спасибо за вашу помощь!

Комментарии:

1. было бы полезно, если бы вы также могли поделиться ассоциацией своей пользовательской модели

2. отредактировал мой ответ, чтобы избежать повторных результатов

Ответ №1:

Я предполагаю, что ваша пользовательская модель has_many :workspaces , если это так, я думаю, вы можете сделать что-то вроде этого:

 workspaces_ids = current_user.workspaces.pluck(:id)
dashboards = Dashboard.joins(:workspaces).where(Workspace.arel_table[:id].in(workspaces_ids)).distinct
 

Вышеизложенное должно оставаться во dashboards всех панелях мониторинга, которые имеют associations какую-либо workspaces внутреннюю current_user.workspaces часть.

Комментарии:

1. Рад помочь! 👌