为什么Mongoid :: Criteria可以使用对象的as_json?

时间:2017-12-21 05:39:38

标签: ruby-on-rails mongoid

我是RoR的新手,使用Mongoid面临问题 代码是由其他人编写的,但我需要做一些修改 这是模型中的代码:

class AClass
  include Mongoid::Document  
  field :data, type: String  
  ...  
  scope ...  

  def self.search(params) 
    AClass.only(...)# return a Criteria Object
  end

  def as_json(options={})
    ...
  end

end

控制器中的代码:

def index
  @res = AClass.search(query_params) # @res is a Criteria Object
  respond_to do |format|
    format.json { render json: @res.as_json(format: params[:format], 
                                            path: request.env['ORIGINAL_FULLPATH']) } # why AClass's as_json is called
    format.xml  { render xml: @res.as_json(format: params[:format],
                                           path: request.env['ORIGINAL_FULLPATH']).
                                           to_xml(root: "root",
                                                  camelize: true) }
    format.html  
  end  
end

我有两个问题:

  1. 我发现only方法属于Mongoid::Criteria,而Mongoid::Document模块不包含Criteria类。上面的代码中只包含Mongoid::Document。为什么only可以在self.search中调用?

  2. 我发现Only的返回值是Mongoid::Criteria。但是,当我请求json数据时,@res.as_json可以调用AClass的{​​{1}}方法。为什么呢?

1 个答案:

答案 0 :(得分:1)

  
      
  1. 我发现只有方法属于Mongoid::Criteria,而Mongoid::Document模块不包含Criteria类。只要   Mongoid::Document包含在上面的代码中。为什么唯一可能   在self.search
  2. 中调用   

可以在Mongoid::Criteria::Queryable::Optional中找到only方法,该方法通过Mongoid::Document委托给您(随意挖掘代码)。

  
      
  1. 我发现only的返回值为Mongoid::Criteria。但是,当我请求json数据时,@res.as_json可以调用   AClass的{​​{1}}方法。为什么?
  2.   

as_json在基础文档集合上调用Mongoid::Criteria#as_json,在每个基础文档上调用as_json

mongoid/criteria.rb

as_json