2012-04-03 33 views
11

Tôi đang cố gắng tìm một hồ sơ bằng tên người dùng liên quan được bao gồm trong một mối quan hệ thuộc về, nhưng nó không hoạt động.đường ray mongoid tiêu chí tìm thấy bởi hiệp hội

điều thuộc về người sử dụng Người dùng có nhiều bài viết

Article.where(user_id: someid) hoạt động tốt, nhưng tôi muốn sử dụng tên người dùng như tài liệu tham khảo được lưu trữ trong bảng Users.

Article.includes(:user).where(:username => "erebus") 
Article.includes(:user).where("user.username" => "erebus") 

Tôi cũng có identity_map_enabled: true

Article.includes(:user).inclusions trả về các chi tiết liên quan

Không làm việc, những gì tôi không hiểu?

Trả lời

27

Bạn phải ghi nhớ rằng không có kết nối nào trong mongodb. Trong dbs quan hệ, includes tạo thành truy vấn tham gia và bạn có thể sử dụng các cột từ cả hai bảng trong truy vấn. Tuy nhiên do không có sự tham gia trong mongodb, cùng là không thể.

Trong mongoid, includes chỉ lưu một loạt các cuộc gọi db. Nó tìm nạp và lưu trữ các bản ghi liên quan trong bản đồ nhận dạng để truy xuất nhanh, nhưng vẫn trong khi truy vấn, một truy vấn chỉ có thể xử lý một bộ sưu tập.

Nếu bạn cần bài viết dựa trên tên người dùng, tôi sẽ đề nghị công việc sau đây xung quanh:

user_ids = User.where(username: 'erebus').only(:_id).map(&:_id) 
articles = Article.where(:user_id.in => user_ids) 
+0

điều gì xảy ra nếu chúng tôi lấy dữ liệu theo cách khác và thực tế không có mảng nào trong bộ sưu tập hiện tại, nhưng một ? – Laurent

+0

oh vâng tôi biết câu trả lời: bạn không thể. – Laurent

13

Bạn có thể làm cho nó chút ngắn hơn so với những gì rubish gợi ý:

user_ids = User.where(username: 'erebus').pluck(:id) 
articles = Article.where(:user_id.in => user_ids) 

Hoặc lót:

articles = Article.where(:user_id.in => User.where(username: 'erebus').pluck(:id)) 
+0

Yêu một lớp lót không có chức năng bản đồ – HoosierCoder

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