我有一个这样的模型:
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
我试图像这样查询:
@lessons_by_user = Lesson.find_by_user_id current_user.id
我得到了:
课程的未定义方法`find_by_user_id':Class
如何通过MongoID中的特定属性进行查询?
我知道如何这样做:
@lessons = Lesson.all(:conditions=>{:user_id=>current_user.id.to_s})
但我想知道是否有捷径...
答案 0 :(得分:9)
Mongoid没有ActiveRecord样式自动创建的finder方法,它只支持一组有限的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
但是,它确实有一个通用where
method所以你这样说:
@lessons = Lesson.where(:user_id => current_user.id)
where
也是可链接的(就像在较新版本的ActiveRecord中的where
一样),因此您可以添加更多条件或通过链接更多条件调用来指定排序。
答案 1 :(得分:3)
从Mongoid 3.0.0版开始,你也可以这样做:
@lessons = Lesson.find_by(user_id: current_user.id)
与where
相反,如果请求未返回任何结果,则会引发Mongoid::Errors::DocumentNotFound
异常。这是默认行为,但如果您将raise_not_found_error
配置选项设置为false
,则在这种情况下它只会返回nil
。