2011-09-28 32 views
7

我试图做一些简单的如:Mongoid“标准”是如何工作的?

User.all(:criteria => {:project_id => 2}) 

这返回的Mongoid::Criteria

我可以用这个标准去做的实例?如果我只是想返回一系列文件作进一步评估呢?

+0

所以'all'在ActiveRecord的返回数组的方法。你想调用'execute'来获取数组。 'User.where(project_id:2).execute' – Travis

回答

2

Criteria是像Relation对象ActiveRecord

您可以使用这种方式

users = User.where(:project_id => 2) 
users.each do |user| 
    puts user.name 
end 
# or 
users.all 

这将返回[]如果没有任何用户

users.all.each do |user| 
    puts user.name 
end 
+0

如果没有符合该标准的用户,那么当我运行puts user.name时,我会自己回到“Criteria”。无论如何要避免这种情况? – randombits

+1

如果现在有任何用户'puts user.name'将不会执行 – fl00r

+1

'users.all'不返回数组。它返回另一个标准,通常不需要。要从条件中获取数组,请使用.to_a – tothemario

15

在Mongoid中,标准代表查询,而不是元素。 您可以将条件视为过滤器,范围,查询对象。

一旦你有一个标准(范围),就可以得到的元素,在执行实际的数据库查询,与应该遍历元件或返回一个元件,例如一个方法:.first.last.to_a,.each,.map

这是更高效,并允许你从其他简单的组成一个复杂的“查询”。

例如,您可以创建在您的类中的一些命名范围:

class User 
    include Mongoid::Document 
    field :name, type: String 
    field :age, type: Integer 
    field :admin, type: Boolean 

    scope :admins, where(admin: true) # filter users that are admins 
    scope :with_name, (name)-> { where(name: name) } # filter users with that name 
end 

然后你就可以创建一些标准对象:

admins  = User.admins 
johns  = User.with_name('John') 
admin_johns = User.admins.with_name('John') # composition of criterias, is like doing ANDs 
young  = User.where(:age.lt => 25) # the Mongoid method .where also returns a criteria 

到目前为止,你没有火任何查询到mongo数据库,您只是在撰写查询。

在任何时候,你可以保留链接指标分析,细化查询更进一步:

young_admins = admins.merge(young) 
old_admins = admins.where(age.gt => 60) 

最后,得到的磁盘阵列和元素:

# Execute the query and an array from the criteria 
User.all.to_a 
User.admins.to_a 
admins.to_a 
young_admins.to_a 

# Execute the query but only return one element 
User.first 
admins.first 
johns.last 

# Execute the query and iterate over the returned elements 
User.each{|user| ... } 
User.admins.each{|admin_user| ... } 
johns.map{|john_user| ... } 

所以,定义一些命名然后使用它们创建一个标准,并在需要时进行真正的查询(延迟加载)。即使你不知道你需要这些,Critterias也会为你处理这些事情。

1

要从Mongoid ::标准得到一个数组:使用.to_a