2012-04-08 14 views
8

Vì vậy, tôi có một hai mô hình như thế nàyTrong Rails, Sử dụng Mongoid, Làm cách nào để tìm tất cả các Mô hình có tham chiếu has_one hợp lệ (không phải là nil)?

class ModelParent 
    include Mongoid::Document 
    field :name, :type => String 
    has_one :model_child 
end 

class ModelChild 
    include Mongoid::Document 
    field :name, :type => String 
    belongs_to :model_parent 
end 

Giả sử tôi có một thể tiếp tục tồn tại của ModelParent gọi mp trong đường ray console

mc = mp.create_model_child(:name=>"child") 

và sau đó làm

mp.model_child 

nó trả về đối tượng hợp lệ

tuy nhiên nếu tôi tìm kiếm nó như này:

ModelParent.where(:model_child.ne => nil).length 

nó trả về 0

tôi đã cố gắng tạo model_child và sau đó gán cho nó, cũng sử dụng build_model_child(), và mỗi phương pháp cho thấy model_child rõ ràng là trong các phụ huynh, tuy nhiên truy vấn cho không nil (.ne) không tìm thấy tất cả ModelParents có con.

Tôi đang làm gì sai?

Cập nhật:

Trả lời câu hỏi của riêng tôi. Tôi vẫn không chắc chắn lý do tại sao: model_child.ne => nil không được làm việc, tuy nhiên ...

tôi giải quyết vấn đề bằng cách mã hóa một cái gì đó như thế này:

def self.with_child 
    user_ids = ModelChild.all.only(:model_parent_id).map(&:model_parent_id) 
    return ModelParent.where(:_id.in => user_ids).all 
    end 

Trả lời

8

Nó không phải là làm việc quan trọng như nước ngoài được lưu trữ thuộc về bên của mối quan hệ. Vì vậy, trong trường hợp của bạn, bộ sưu tập ModelChild sẽ có một trường model_parent_id chứ không phải theo cách khác. Tôi đoán bạn đã đoán ra, nhưng thay vì giải quyết nó theo cách bạn đã làm, tôi sẽ đề nghị bạn chuyển xung quanh has_onebelongs_to hiệp hội và sau đó sử dụng:

ModelParent.where(:model_child_id.ne => nil) 
+0

Cảm ơn rất nhiều, điều đó có tác dụng! – KDKotU

0

tôi sẽ không dựa vào .ne trong trường hợp này, tôi thấy rằng phương thức .ne không phải lúc nào cũng hoạt động tốt: Ví dụ: thử đặt một chuỗi có tên là "false" và cố gắng tìm kiếm nó bằng.ne ;-)

tôi phát hiện ra rằng đối với trường hợp như vậy, cách tốt nhất để tìm ra mô hình phù hợp chắc chắn là để lọc theo nguồn gốc Mông Cổ $type

ModelParent.where(:model_child_id => { :$type => 7 }) 

Bên dưới danh sách các loại được biết, các mặt hàng này nhiều hiệu quả hơn để tìm các lĩnh vực bị thay đổi

  • đúp 1
  • string 2
  • Ob JECT 3
  • Mảng 4
  • Dữ liệu nhị phân 5
  • Không xác định (phản đối) 6
  • Object id 7
  • Boolean 8
  • ngày 9
  • Null 10
  • Regular Expression 11
  • JavaScript 13
  • Symbol 14
  • JavaScript (với phạm vi) 15
  • 32-bit số nguyên 16
  • Timestamp 17
  • 64-bit số nguyên chìa khóa 18
  • Min chìa khóa 255
  • Max 127
0

Tôi tìm thấy một cách khác, nhưng tôi không biết nếu hiệu quả hơn hay ít hơn: bạn có thể sử dụng phương pháp từ chối. Ví dụ:

ModelParent.all.reject{ |r| r.model_child.nil?}