有很多通过协会

问题描述

我有两个具有 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

我是通过这种方式获取 workspaces_ids 的:

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。

有没有办法在我的控制器中使用查询来实现这一点?

非常感谢您的帮助!

解决方法

我会假设您的用户模型 has_many :workspaces 如果是这种情况,我认为您可以执行以下操作:

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

以上内容应将所有具有 dashboardsassociations 内的任何 workspaces 的仪表板留在 current_user.workspaces 中。