2011-06-30 37 views
6

Tôi mới đến mongo/mongoid và tôi đang cố gắng thiết lập một mối quan hệ tự tham chiếu trên bảng trang web của tôi.MongoDB mongoid tự tham khảo mối quan hệ

# sites model 

has_many :child_sites, :class_name => 'Site' 
belongs_to :parent, :class_name => 'Site' 

#controller 

@event = current_site.child_sites.build(params[:site]) 

current_site là hàm trả về đối tượng hiện tại của trang web.

tôi nhận được lỗi này -

không xác định phương pháp 'mục cho #

+0

Không chắc chắn vấn đề cụ thể của bạn là gì nhưng đây không phải là lược đồ thân thiện với rất mongodb. Lưu ý rằng "mối quan hệ" như là một khái niệm không tồn tại trong mongodb do đó ở trên sẽ dẫn đến rất nhiều truy vấn (mỗi "mối quan hệ" sẽ phải được truy vấn riêng biệt bởi trình điều khiển). –

+0

Cảm ơn bạn đã tư vấn, cách tốt nhất để tạo trang web mẹ có trang web con là gì? – Alex

Trả lời

13

Bạn có thể thử thay đổi định nghĩa mối quan hệ của bạn như sau:

has_many :child_sites, :class_name => 'Site', :cyclic => true 
belongs_to :parent_site, :class_name => 'Site', :cyclic => true 

tôi không biết chính xác những gì nó làm, nhưng tôi nhớ nó đang được thảo luận trong nhóm google Mongoid. Nếu điều đó không hiệu quả, bạn nên thử đặt inverse_of trên cả hai macro quan hệ. Hầu hết thời gian thiết lập inverse_of chính xác thực hiện công việc.

has_many :child_sites, :class_name => 'Site', :inverse_of => :parent_site 
belongs_to :parent_site, :class_name => 'Site', :inverse_of => :child_sites 

Giới thiệu về các truy vấn bổ sung, có sẽ có thêm truy vấn bất cứ khi nào bạn muốn tìm child_sites của trang web hoặc trang web mẹ của trang web.

Bạn nên xem xét nhúng trang web con vào trang mẹ, nhưng hãy nhớ rằng bạn sẽ mất khả năng truy vấn trang web con theo cách độc lập. Bạn sẽ luôn phải truy cập bất kỳ trang con nào là "parent_site> child_sites".

Cũng lưu ý giới hạn 16MB về kích thước tài liệu, khó tiếp cận, nhưng có thể nếu có nhiều trang con cho cha mẹ và nếu bạn lưu trữ thông tin mẫu, như html, css, v.v ... trong chính tài liệu.

4

Cyclic ban đầu được triển khai cho tài liệu được nhúng (see user group entry). Để thực hiện việc này trên mongoid 2.3 hoặc cao hơn, bạn phải loại bỏ các tùy chọn cyclic:

has_many :child_sites, :class_name => 'Site' 
belongs_to :parent_site, :class_name => 'Site' 
Các vấn đề liên quan