Rails has_many_through и несколько элементов

У меня много моделей с использованием отношения has_many_through: users, roles и security_items.

Пользователь может быть в нескольких ролях, в роли может быть много элементов безопасности. Итак, если пользователь находится в нескольких ролях, как я могу узнать, является ли конкретный элемент какой-либо из ролей? Подобно тому, как это истинно в одном, но ложном в другом, истинное должно иметь приоритет.

Если пользователь находится только в одной роли, то работает следующее, но если у пользователя несколько ролей, то в rails console

role = RoleMembership.where("user_id = ?", user.id)
role.security_items.exists?(1)

Ошибка, если пользователь находится в нескольких ролях:

NoMethodError: undefined method 'security_items' for #<activerecord::relation::activerecord_relation_rolemembership:0x00000102da5e28>'
</activerecord::relation::activerecord_relation_rolemembership:0x00000102da5e28>

Как проверить каждую роль, чтобы увидеть, существует ли элемент в таблице?

2 ответа

RoleMembership.where("user_id = ?", user.id).select { |role| role.security_items.present? }

Работая над кодом, который вы положили, вот как я это сделаю.

РЕДАКТИРОВАТЬ:

Если вы получаете ошибку NOMETHOD, это означает, что для этой роли не существует метода security_items. Правильно ли настроены ваши отношения в моделях? Вы можете попробовать в консоли

RoleMembership.find(1).security_items

Если это ошибка, вы определили свою проблему.


Попробуйте role.map(&:security_items).flatten.uniq чтобы получить все элементы безопасности.

licensed under cc by-sa 3.0 with attribution.