因此,当用户的角色名称与该区域的名称匹配时,我正在尝试筛选,并且我被困在三个表之间的Arel连接上。
用户具有名称、role_id、电子邮件等用户has_many角色。角色表具有id和名称。区域有名字,位置。区域不属于用户。
示例:
因此,我的想法是用户连接区域,其中区域名称匹配。
到目前为止我所拥有的是:
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我认为这可能是一个比赛问题,所以我也尝试了。同样的问题也出现了:没有将符号隐式转换为字符串。
这个想法是,用户有一个分配给他们的角色,并且只能查看那些具有与该角色匹配的名称的事件。
所以,如果约翰·史密斯登录,他只会看到那些太平洋西北地区的事件。
发布于 2019-10-01 17:56:25
我可能还没有完全领会到你的问题,但似乎你应该能够做这样的事情:
Event < ApplicationRecord
belongs_to :region
class << self
def for_user(user)
return self if user.super_admin?
joins(:region).where(region: {id: Region.where(name: user.role.name)})
end
end
end这应该返回所有Event,其中event.region_id保存与user's role中的name匹配的任何Region的id。
我看到您有一种使用arel_table的方法。我将把这作为一种非arel_table,非lambda,非scope的方法。
此外,我将从我的评论中重申,文档状态:
使用类方法是接受作用域参数的首选方法。
发布于 2019-10-01 17:54:06
在百灵鸟上,我试了一试,结果成功了:
joins(:region).where(
Region.arel_table[:name].matches("%#{user&.role.name}%")
)https://stackoverflow.com/questions/58188964
复制相似问题