2012-03-17 35 views
5

Tôi có một mô hình như thế này:Rails + MongoID - Truy vấn bởi thuộc tính

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 

Và tôi đang cố gắng để truy vấn như thế này:

@lessons_by_user = Lesson.find_by_user_id current_user.id 

Và Tôi nhận:

phương thức chưa xác định `find_by_user_id 'cho Bài học: Lớp

Tôi làm cách nào để truy vấn bằng thuộc tính cụ thể trong MongoID?

tôi biết làm thế nào để làm điều đó như thế này:

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

nhưng tôi tự hỏi nếu có một phím tắt ...

Trả lời

9

Mongoid không có ActiveRecord phong cách phương pháp công cụ tìm tự động tạo ra, nó chỉ hỗ trợ một tập hạn chế về 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

Tuy nhiên, nó có một mục đích chung where method vì vậy bạn nói điều này:

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

where cũng có thể chuỗi (giống như where trong phiên bản mới hơn của ActiveRecord) để bạn có thể thêm nhiều điều kiện hơn hoặc chỉ định thứ tự bằng cách chuỗi các cuộc gọi tiêu chí khác.

+0

Tuyệt vời. Thực sự tốt để biết. –

3

Kể từ phiên bản 3.0.0 của Mongoid, bạn cũng có thể làm:

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

Trái với where, nó sẽ nâng cao một ngoại lệ Mongoid::Errors::DocumentNotFound nếu yêu cầu trả lại không có kết quả. Đó là hành vi mặc định, nhưng nếu bạn đặt tùy chọn cấu hình raise_not_found_error thành false, nó sẽ chỉ trả lại nil trong trường hợp này.

Nguồn: http://mongoid.org/en/mongoid/docs/querying.html

+1

Cảm ơn bạn đã sửa các tài liệu "2 so với 3" ở trên. Ngay cả AR cũng đang tiến tới 'find_by' thay vì tất cả những thứ' find_by_user_id' khó chịu trong 'method_missing'. –

Các vấn đề liên quan