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.
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.