Поэтому я пытаюсь фильтровать, когда имя роли пользователя совпадает с именем региона, и я застреваю в объединении Arel между тремя таблицами.
У пользователя есть имя, role_id, email и т. Д. Пользователь has_many ролей. Ролевая таблица имеет идентификатор и имя. Регион имеет название, местоположение. Регион не принадлежит пользователю.
Пример:
- Идентификатор Джона Смита: 20, идентификатор роли: 15
- Идентификатор роли: 15, имя: Северо-западный регион Тихого океана
- Идентификатор региона: 5, имя: Тихоокеанский Северо-Запад
Так что я подумал бы присоединиться к региону, где имя региона совпадает
Что у меня есть:
scope :for_user, lambda { |user|
if user.super_admin?
self
else
joins(:region).where(
Region.arel_table[:name].matches(Role.arel_table[:id].eq(User.arel_table[:role_id]))
)
end
}
def viewable_by?(user)
return user.super_admin? || user&.role.name == region.name
end
Я ссылаюсь на for_user и viewable_by в контроллере событий
def index
@events = search_event.paginate(page: params[:page])
end
def search_event
Event.order(sortable_query)
.for_user(current_user)
.includes(:region)
.advanced_search(
params[:search],
params[:region_id]
)
end
def load_event
@event = Event.find_by!(id: params[:id])
raise DeniedError unless @event.viewable_by?(current_user)
end
Я подумал, что это может быть проблема совпадений, поэтому я тоже попробовал. Возникает та же проблема: нет неявного преобразования Symbol в String.
Идея состоит в том, что пользователю назначена роль, и он может просматривать только те события, имя которых соответствует этой роли.
Так что, если Джон Смит войдет в систему, он увидит только эти события на Тихоокеанском северо-западе.