2013-04-05 3 views
2

У меня есть таблица пользователей (модель данных), которая имеет столбец с именем permission, который содержит значение битмаски.Ruby datamapper - поиск по значению флага

property :permission, Flag[:perm1, :perm2, :perm3]

Я хочу, чтобы найти всех пользователей, у которых есть определенные права доступа, такие как perm1 и perm2

так я называю,

User.all(:permission => [:perm1, :perm2])

Это делает запрос

select * from user where permission = 3 это неверно. в то время как правильный запрос должен быть (потому что это тип - flag)

select * from user where permission &1 != 0 and permission &2 != 0

ли кто-нибудь в рубиновой DataMapper, как сделать вызов поиск значений флага.

ответ

1

Я не мог найти прямой способ сделать это. Так и использовал этот хак.

User.all(:conditions => ['permission & ? != 0 and permission & ? != 0', 1,2])

1

Какую версию вы используете? В 1.2, я получаю SELECT ... FROM "users" WHERE "permission" IN (1, 2) ... с User.all(:permission => [:perm1, :perm2]).

Одним из вариантов является объединение: User.all(:permission => :perm1) | User.all(:permission => :perm2).

Или, может быть сокращен до User.perm1s | User.perm2s метод класса:

class User 
    # ... 
    def self.perm1s; all :permission => :perm1 end 
    def self.perm2s; all :permission => :perm2 end 
end 

Не точно такой же запрос, либо один, как вы показали, но результат должен быть одинаковым.