2012-07-04 40 views
1

我有以下结构:查询嵌入文档匹配多个属性

class User 
    include Mongoid::Document 
end 

class Resource 
    include Mongoid::Document 
    embeds_many :permissions 
end 

class Permission 
    include Mongoid::Document 
    embedded_in :resource 

    field :read, type: Boolean 
    field :write, type: Boolean 

    field :user_id, type: BSON::ObjectId 
end 

现在让我们假设我有以下数据:

1.9.3p194 :001 > a = User.create 
=> #<User _id: 4ff46818f83222daf9000001, _type: nil> 
1.9.3p194 :002 > b = User.create 
=> #<User _id: 4ff4681bf83222daf9000002, _type: nil> 
1.9.3p194 :003 > r = Resource.create 
=> #<Resource _id: 4ff46822f83222daf9000003, _type: nil> 
1.9.3p194 :004 > r.permissions.create(read: true, user_id: a.id) 
=> #<Permission _id: 4ff46835f83222daf9000004, _type: nil, read: true, write: nil, user_id: 4ff46818f83222daf9000001> 
1.9.3p194 :005 > r.permissions.create(read: true, write: true, user_id: b.id) 
=> #<Permission _id: 4ff4684af83222daf9000005, _type: nil, read: true, write: true, user_id: 4ff4681bf83222daf9000002> 

现在我想找到用户A拥有所有资源写访问(应该是none)

1.9.3p194 :007 > Resource.where('permissions.write' => true).where('permissions.user_id' => a.id).all.entries 
=> [#<Resource _id: 4ff46822f83222daf9000003, _type: nil>] 

这显然失败了,因为对于每个where子句有匹配。 这将是什么正确的解决方案?有没有办法为嵌入式文档查询做and

回答

1

试试这个

Resource.where(:permissions.matches => {:write => true, :user_id => a.id}).all 
+0

这似乎是正确的mongoid2。因为我使用的是mongoid3(应该提到)解决方案是:'Resource.where(:permissions.elem_match => {:write => true,:user_id => a.id})' – mxhaack

-1

试试这个:

Resource.Permission.where(写:真,USER_ID:a.id)

+0

将返回:'NoMethodError:未定义的方法'权限'资源:类' – mxhaack