ran*_*its 7 ruby-on-rails mongodb mongoid
我正在尝试直接做一些事情,例如:
User.all(:criteria => {:project_id => 2})
Run Code Online (Sandbox Code Playgroud)
这将返回一个实例 Mongoid::Criteria
我可以用这个标准做什么?如果我只是想要返回文档数组以进行进一步评估,该怎么办?
tot*_*rio 16
在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
Run Code Online (Sandbox Code Playgroud)
然后,您可以创建一些标准对象:
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
Run Code Online (Sandbox Code Playgroud)
到目前为止,您没有向mongo数据库发出任何查询,您只是在编写查询.
您可以随时保持链接标准,进一步优化查询:
young_admins = admins.merge(young)
old_admins = admins.where(age.gt => 60)
Run Code Online (Sandbox Code Playgroud)
最后,获取带有元素的Array:
# 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| ... }
Run Code Online (Sandbox Code Playgroud)
因此,在Class中定义一些命名范围,然后使用它们创建条件,并在需要时进行实际查询(延迟加载).即使您不知道自己需要它,Criterias也会为您处理所有这些问题.
Criteria是类似Relation对象的东西ActiveRecord
你可以这样使用它
users = User.where(:project_id => 2)
users.each do |user|
puts user.name
end
# or
users.all
Run Code Online (Sandbox Code Playgroud)
[]如果没有任何用户,这将返回
users.all.each do |user|
puts user.name
end
Run Code Online (Sandbox Code Playgroud)