简体   繁体   中英

Rails + MongoID - Querying by attribute

I have a model like this:

class Lesson
  include Mongoid::Document

  field :title, :type => String
  field :category, :type => String
  field :price, :type => Float
  field :description, :type => String
  field :user_id, :type => String


  validates_presence_of :title
  validates_presence_of :category
  validates_presence_of :price
  validates_presence_of :user_id

  attr_accessible :title, :category, :description, :price

end

And I am trying to query like this:

@lessons_by_user = Lesson.find_by_user_id current_user.id

And I am getting:

undefined method `find_by_user_id' for Lesson:Class

How can I query by a specific attribute in MongoID?

I know how to do it like this:

@lessons = Lesson.all(:conditions=>{:user_id=>current_user.id.to_s}) 

but I am wondering if there is a shortcut...

Mongoid doesn't have the ActiveRecord style auto-created finder methods, it only supports a limited set of predefined finder methods :

  • Model.all
  • Model.count
  • Model.exists?
  • Model.find
  • Model.find_or_create_by
  • Model.find_or_initialize_by
  • Model.first
  • Model.last

However, it does have a general purpose where method so you say this:

@lessons = Lesson.where(:user_id => current_user.id)

where is chainable as well (just like where in newer versions of ActiveRecord) so you can add more conditions or specify the ordering by chaining more criteria calls.

Since the version 3.0.0 of Mongoid, you can also do:

@lessons = Lesson.find_by(user_id: current_user.id)

Contrary to where , it will raise a Mongoid::Errors::DocumentNotFound exception if the request returns no result. It's the default behavior, but if you set the raise_not_found_error configuration option to false , it will just return nil in this case.

Source: http://mongoid.org/en/mongoid/docs/querying.html

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM