快速更新位字段以获得额外的权限

时间:2011-07-19 19:58:02

标签: ruby-on-rails ruby postgresql

我有一个Ruby on Rails应用程序,它使用位字段来存储用户设置。我现在正在添加必须根据用户现有权限设置默认值的其他位。例如,如果用户拥有“A”或“B”权限,则会自动获得权限“C”。通过UPDATE ALL查询执行此操作是否存在任何好方法?

1 个答案:

答案 0 :(得分:2)

迁移中的直接SQL可能是您最好的选择:

def self.up
    execute(%Q{
        UPDATE table
        SET permissions = permissions | bit_C
        WHERE permissions & bits_A_and_B <> 0
    })
end

bit_C替换为具有权限C set的位的适当位图,将bits_A_and_B替换为仅具有权限A和B的位(两者都设置)的位图。 bit operators for PostgreSQL几乎相同(除了按位XOR),因为它们在C中。如果您使用bitstrings而不是整数作为位图,那么类似的东西将会起作用。