has_and_belongs_to_many权限过滤

时间:2018-03-30 14:01:45

标签: mysql ruby-on-rails ruby ruby-on-rails-4 activerecord

我需要在两个模型之间找到记录。

class Report
  has_and_belongs_to_many :groups
end

class Group
  has_and_belongs_to_many :reports
end

和join_table - reports_groups

我有一组我有权访问的组ID,例如[1, 2]。 我需要查找包含我可以访问的组的报告,只有它们。

If report has groups list like: [1], [2], [1,2] it is OK.
If report has - [1,2,3] - skip it.
If - [3,4] - skip it to.

我只需要允许使用我的群组的报告。

2 个答案:

答案 0 :(得分:0)

仔细检查联接表的名称。

Report.where(
  'NOT EXISTS(SELECT * FROM reports_groups WHERE report_id = reports.id AND group_id IN (?))',
  [1, 2],
)

答案 1 :(得分:0)

为什么不在arel_table建筑物

中使用复杂查询

accessible_group_ids = [1, 2, ..., n] Report.joins(:groups).where(Group.arel_table[:id].in(accessible_group_ids)).distinct