角色模型宝石:如何让所有具有角色的用户:[:admin,:mentor]

时间:2016-04-28 02:03:46

标签: sql ruby-on-rails ruby

我的项目中有一些搜索过滤器。您可以按角色搜索用户。如果您搜索: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"

谢谢!

3 个答案:

答案 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]) )