Я делаю фильтр на странице по роли. Так что если пользователь super_admin, то все остальное показывают по его роли, где роль совпадает через две таблицы.
Пример пользователя:
- Пользователь: Джон Смит
- Роль: Тихоокеанский северо-запад
Регион Пример:
- Регион: Тихоокеанский северо-запад
- Местонахождение: Сиэтл, Портленд, Бойсе
Если Джон входит в систему, чтобы увидеть события, он должен видеть только те события, у которых есть Местоположение в пределах Региона. Скажем, в Портленде есть событие, и Джон его увидит.
Users has_many Roles, Regions has_many Locations. События принадлежат_Положению и региону, но необязательно.
Сейчас это работает для подключения роли пользователя к региону:
scope :for_user, lambda { |user|
if user.super_admin?
self
else
joins(:region)
.where(Region.arel_table[:name].matches("%#{user&.role&.name}%"))
end
}
Итак Location.name, Location.region_id = Region.id, Region.name = Role.name, Role.id = User.role_id.
Я думал, что могу попробовать что-то вроде:
joins(:location)
.where(Location.arel_table[:region_id]).matches("%#{region.id}")
.joins(:region)
.where(Region.arel_table[:name].matches("%#{user&.role&.name}%"))
Это, однако, дает:
Неподдерживаемый тип аргумента: #
Так, учитывая, что сортируемая таблица имеет местоположения и регионы. Как мне отфильтровать это, основываясь на роли пользователя, соответствующей имени местоположения?
Редактировать:
Я подумал, что смогу переключить его следующим образом:
region = Region.find_by(name: user&.role&.name)
if region.present?
joins(:location)
.where(location_id: region.location_ids)
end
ЭтоОднако показывает все места. Я чувствую, что это несколько близко. И тогда я попытался:
region = Region.find_by(name: user&.role&.name)
if region.present?
location = region.where(location_id: region.location_ids)
return true if location.present?
end
Не удалось, поэтому я попытался:
region = Region.find_by(name: user&.role&.name)
list_locations = []
Location.all.each.do |loc|
list_locations << loc.name if loc.region_id == region.id && region.present?
end
self if list_location.present?
В итоге просто показывает все.