2012-05-10 8 views
6

Làm cách nào để kiểm tra xem tài liệu được nhúng có tồn tại cho tài liệu sử dụng mongoid trong Ruby on Rails không? Giả sử tôi có tài liệu username, email và có thể có tài liệu được nhúng nicknames. Ngay bây giờ nếu tôi chạy user.first.nicknames và nếu điều đó user không có tài liệu được nhúng nicknames trong đó, nó sẽ bị lỗi. Tôi đã thử matches?exists? nhưng chúng không hoạt động.Làm cách nào để kiểm tra xem tài liệu được nhúng có tồn tại trong tài liệu trong mongoid không?

Cảm ơn!

Trả lời

3

này sẽ trả về đúng nếu nó không tồn tại User.first.nicknames.nil? và điều này sẽ trở thành sự thật nếu nó tồn tại: User.first.nicknames.present?

+0

Cả hai đều không hoạt động trên một tài liệu mongoDB mà không có 'biệt danh'. Nó tạo ra một lỗi "NoMethodError: undefined method' nicknames' ". Điều này làm việc cho các tài liệu có 'biệt hiệu' .. – Goalie

+0

Đó không phải là những gì tôi làm, tôi đang sử dụng MongoId 2.3.3. Dường như với tôi rằng 'User.first' thực sự là không. Vì vậy, bạn đang cố gắng gọi 'biệt danh' trên một đối tượng nil. Bạn có thể xác minh điều đó không? – ctcherry

0

nên càng đơn giản càng {"user":{"$exists":"nicknames"}}

+0

Đây có phải là lệnh trình bao mongo không? Tôi đang tìm một giải pháp trong Ruby on Rails. – Goalie

2

Bạn có thể làm User.where(:nicknames.exists => true).include?(user).

User.where(:nicknames.exists => true) sẽ chỉ trả về các tài liệu có chứa nicknames.

8

Với một chút trợ giúp từ các câu trả lời khác ở đây, tôi đã tìm thấy điều gì đó phù hợp với tôi và tôi nghĩ đây là những gì mà áp phích ban đầu có trong đầu;

Model.where(:"subdoc.some_attribute".exists => true) 

này sẽ trả lại toàn bộ tài liệu có "some_attribute" tồn tại trên subdocument. Lưu ý cú pháp của biểu tượng, đó là những gì tôi đã bỏ lỡ.

+0

Bạn cũng có thể đi qua liên kết: 'Model.subdocs.where (: field.exists => true)'. –

+0

Đây là những gì tôi đã tìm kiếm cả ngày. Nó không được ghi chép ở đâu cả !? – fre2ak