2

我有一个用户表(数据映射器模型),它有一个名为的列permission,其中包含位掩码值。

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

有没有人在 ruby​​ datamapper 中,如何调用在标志值中进行搜索。

4

2 回答 2

1

我找不到任何直接的方法来做到这一点。所以确实使用了这个黑客。

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

于 2013-04-05T19:36:08.217 回答
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

与您显示的任何一个查询都不完全相同,但结果应该是相同的。

于 2013-04-10T13:39:42.740 回答