2013-05-13 46 views
0

我想知道如何检查数组元素是否存在于MongoMapper数组中。 This question是我能找到的最接近的,但它解决了查询问题,而不是简单地使用您已有的文档。你怎么称呼“包含?”在Rails 3中的MongoMapper数组?

我的用户模型包含线

key :roles, Array 

的“角色”数组包含字符串,如“管理”或“用户”。对于授权,我需要调用类似下面的方法对用户的一个实例:

if user.roles.contains?('admin') 
    # Do administrative stuff. 
end 

但是,当我尝试调用“包含?”红宝石抱怨说,有没有这样的方法:“包含”

NoMethodError (undefined method `contains?' for #<Array:0x007fc845cd8948>): 
    app/models/ability.rb:11:in `initialize' 
    app/controllers/settings_controller.rb:5:in `index' 

如果没有办法做到这一点,那么我该如何转换数组一个Ruby数组打电话?调用to_a不这样做:

if user.roles.to_a.contains?('admin') # etc... 

我使用Rails 3.2.13和Ruby-1.9.3-P392,并在山狮MongoMapper 0.12.0。

+0

我不熟悉的MongoDB所以这个建议是noobish。 'user.roles'返回的结果是什么? – jason328 2013-05-13 01:04:22

+0

答案是...... Ruby数组没有'contains?'方法。它被称为'include?'。唉...... – 2013-05-13 01:06:30

+0

@ jason328它正在返回'#'。无论如何,我的愚蠢的错误不知道正确的方法名称。 – 2013-05-13 01:07:41

回答

2

您正在寻找的功能是include?,这样的表达应该是:user.roles.include?('admin')

但是既然你提到mongomapper,如果你的角色阵列上预成型的查询,你会做的休耕:

User.where(:roles => 'admin') 

也可以搜索一个数组的数组

User.where(:roles.in => ['admin']) 

与管理员或用户查询,你可以这样做:

User.where(:$or => [{:roles => 'admin'},{:roles => 'user'}]) 

,你可以做,只是相同的:

User.where(:$and => [{:roles => 'admin'},{:roles => 'user'}]) 
+0

@ muistooshort - 是的,我打错了 – 2016-02-03 15:02:10