Rails / Active Record has_many через ассоциацию - извлечение записи - PullRequest
3 голосов
/ 18 ноября 2011

У меня есть отношение has_many моделей Role и Access через модель Permission.

У меня есть ситуация, когда никакие две роли не должны иметь одинаковый доступ. Итак, я создал пользовательскую проверку, которая в основном приводит к сообщению об ошибке, когда текущей роли (создаваемой) назначаются те же права доступа, что и ранее существующим ролям с использованием

errors.add(:Role, "already exists with selected permissions") if Role.all.map(&:access_ids).include?(self.access_ids)

Это все отлично работает. Теперь мне нужно получить роль, доступ к которой идентичен текущей роли. Итак, как мне это сделать? Я пробовал с

Role.includes(:accesses).where(:accesses => {:id => [1,2]}).count

но это возвращает все роли, чьи идентификаторы доступа имеют 1 или 2 (скажем, [1, 2, 3, 4], [1], [2]). Мне нужно получить роль, чьи идентификаторы доступа равны 1 и 2.

Было бы неплохо, если бы я мог заменить '=>' на '==' в приведенном выше запросе :) Но это, очевидно, не работает.

1 Ответ

0 голосов
/ 18 ноября 2011

Не знаю запрос к этому, но вы можете получить роль через ruby, делая это

Role.all.to_a.find{|r| r.access_ids == self.access_ids}

В ответ на ваш комментарий ниже о том, что при этом запускается слишком много запросов, используйте этот метод, который будет запускать только 2 запроса.

 Role.includes(:permissions).find{|r| r.permissions.map(&:access_id) == self.access_ids}

Вы также можете использовать это для проверки,

Role.includes(:permissions).any?{|r| r.permissions.map(&:access_id) == self.access_ids}

Вы предложили, что Role.include (: доступ) запускает три запроса, тогда как Role.include (: разрешения) запускает только два

...