Rails Arel_table Соединение нескольких таблиц через область видимости - PullRequest
0 голосов
/ 07 октября 2019

Я делаю фильтр на странице по роли. Так что если пользователь 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?

В итоге просто показывает все.

1 Ответ

0 голосов
/ 07 октября 2019

Оставьте это здесь на случай, если кому-то это поможет:

region = Region.find_by(name: user&.role&.name)
if region.present?
 joins(:location)
  .where(location_id: region.location_ids)
end

Это действительно сработало. Я обновил свой вид, чтобы показать местоположение & .region & .name и заметил, что он фильтруется, и у меня просто так много страниц, что оно не работает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...