фильтрация разрешений has_and_belongs_to_many

0

Мне нужно найти записи между двумя моделями.

class Report
  has_and_belongs_to_many :groups
end

class Group
  has_and_belongs_to_many :reports
end

и join_table - reports_groups

У меня есть массив идентификаторов групп, у меня есть доступ, например [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.

Мне нужны только отчеты с разрешенными мной группами.

  • 0
    что вы имеете в виду, If report has - [1,2,3]
  • 0
    это означает, что в отчете есть группы с идентификаторами [1,2,3]. например report.groups.pluck (: id) вернет [1,2,3]
Теги:
activerecord
ruby-on-rails-4

2 ответа

0

Почему бы просто не использовать сложный запрос с построением arel_table

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

  • 0
    он возвращает все отчеты, где есть хотя бы одна группа, для которой я разрешен, он работает
  • 0
    Извините, я неправильно понял, вам нужно, чтобы все они соответствовали
0

Дважды проверьте имя вашей таблицы соединений.

Report.where(
  'NOT EXISTS(SELECT * FROM reports_groups WHERE report_id = reports.id AND group_id IN (?))',
  [1, 2],
)
  • 0
    он не работает, он все еще возвращается, он пытался сообщить с group1 и group2. У пользователя есть разрешение только для group1, запрос все еще возвращает мне этот отчет
  • 0
    @pereslop, не могли бы вы поделиться точным кодом, который вы использовали?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню