我的项目中有一些搜索过滤器。您可以按角色搜索用户。如果您搜索:admin
,则只会返回角色为[:admin]
的用户。但它WONT将用户添加到角色为[:admin, :mentor]
的搜索结果中。
有没有人知道如何制作一个SQL查询,它会找到所有拥有角色管理员的用户,他们必须包含具有角色的用户:[:admin,:mentor],因为这些用户仍然是管理员。
20: custom_filter :role, lambda { |records, value|
=> 21: binding.pry
22: records.where(roles_mask: User.mask_for(value))
23: }
24:
25: class << self
26: def secure_find!(token:)
4.2.5.1@2.2.4 (User)> records
=> User(id: integer, email: string, encrypted_password: string, reset_password_token: string, roles_mask: integer)
4.2.5.1@2.2.4 (User)> value
=> "admin"
谢谢!
答案 0 :(得分:3)
您可能只在values
中传递了一个角色:
records.where(roles_mask: User.mask_for(value))
确保value
同时包含:
records.where(roles_mask: User.mask_for([:admin, :mentor]))
答案 1 :(得分:1)
我找到了一种方法来做到这一点
custom_filter :role, lambda { |records, value|
records.where("roles_mask & ? != 0", User.mask_for(value))
}
这将返回具有角色Users
的所有admin
。即使用户有2个角色,甚至3个角色,如[:admin, :mentor]
,它也会在结果中包含他的用户。
答案 2 :(得分:0)
仅使用具有[:admin]角色的用户的解决方案是使用 BINARY 运算符。
想象一下您的角色:[:admin, :moderator, :writer]
在BINARY中:[1,2,4]
在 MySQL / MariaDB 中,选择具有主持人角色的用户:
select * from users where (BINARY(roles_mask) & BINARY(2)) > 0
在铁路:
User.where("(BINARY(roles_mask) & BINARY(#{User.mask_for([:moderator])})) > 0" )
或
User.where("(BINARY(roles_mask) & BINARY(?)) > 0", User.mask_for([:moderator]) )