2010-01-04 3 views
7

Tôi đang cố gắng để có được một kết quả tốt hơn và có tổ chức từ việc sử dụng thừa kế lớp với MongoMapper, nhưng gặp một số rắc rối.MongoMapper Parent Inheritance

class Item 
    include MongoMapper::Document 

    key :name, String 
end 

class Picture < Item 
    key :url, String 
end 

class Video < Item 
    key :length, Integer 
end 

Khi tôi chạy các lệnh sau, chúng không hoàn trả được những gì tôi mong đợi.

>> Item.all 
=> [#<Item name: "Testing", created_at: Sun, 03 Jan 2010 20:02:48 PST -08:00, updated_at: Mon, 04 Jan 2010 13:01:31 PST -08:00, _id: 4b416868010e2a04d0000002, views: 0, user_id: 4b416844010e2a04d0000001, description: "lorem?">] 
>> Video.all 
=> [#<Video name: "Testing", created_at: Sun, 03 Jan 2010 20:02:48 PST -08:00, updated_at: Mon, 04 Jan 2010 13:01:31 PST -08:00, _id: 4b416868010e2a04d0000002, views: 0, user_id: 4b416844010e2a04d0000001, description: "lorem?">] 
>> Picture.all 
=> [#<Picture name: "Testing", created_at: Sun, 03 Jan 2010 20:02:48 PST -08:00, updated_at: Mon, 04 Jan 2010 13:01:31 PST -08:00, _id: 4b416868010e2a04d0000002, views: 0, user_id: 4b416844010e2a04d0000001, description: "lorem?">] 

Họ là tất cả các kết quả tương tự, tôi sẽ mong đợi để có Item.all danh sách tất cả các kết quả, vì vậy kể cả chính nó, Picture, và Video. Nhưng nếu mặt hàng thực sự là một Picture, tôi muốn nó được trả lại nếu tôi chạy Picture.all và không nếu tôi chạy Video.all. Bạn có biêt tôi đang nghĩ gì?

Tôi có hiểu lầm cách thức hoạt động của kế thừa ở đây không? Nếu tôi là cách tốt nhất để nhân rộng loại hành vi này là gì? Tôi đang cố gắng theo dõi this (điểm 2) như một hướng dẫn về cách tôi muốn công việc này. Tôi cho rằng anh ta có thể chạy Link.all để tìm tất cả các liên kết và không bao gồm mọi lớp khác kế thừa từ Item. Liệu tôi có sai?

Trả lời

10

Ví dụ bạn liên kết đến là một chút gây hiểu nhầm (hoặc có thể khó theo dõi) ở chỗ nó không hiển thị định nghĩa đầy đủ cho mô hình Item. Để sử dụng thừa kế trong các mô hình của bạn, bạn sẽ cần phải xác định một khóa _type trên mô hình gốc. MongoMapper sau đó sẽ tự động đặt khóa đó thành tên lớp của lớp thực tế của tài liệu đó. Vì vậy, ví dụ, bạn có mô hình sẽ bây giờ nhìn như thế này:

class Item 
    include MongoMapper::Document 

    key :name, String 
    key :_type, String 
end 

class Picture < Item 
    key :url, String 
end 

class Video < Item 
    key :length, Integer 
end 

và đầu ra của tìm kiếm của bạn (giả sử bạn đã tạo một đối tượng Picture) sẽ biến thành:

>> Item.all 
=> [#<Picture name: "Testing", _type: "Picture", created_at: Sun, 03 Jan 2010 20:02:48 PST -08:00, updated_at: Mon, 04 Jan 2010 13:01:31 PST -08:00, _id: 4b416868010e2a04d0000002, views: 0, user_id: 4b416844010e2a04d0000001, description: "lorem?">] 
>> Video.all 
=> [] 
>> Picture.all 
=> [#<Picture name: "Testing", _type: "Picture", created_at: Sun, 03 Jan 2010 20:02:48 PST -08:00, updated_at: Mon, 04 Jan 2010 13:01:31 PST -08:00, _id: 4b416868010e2a04d0000002, views: 0, user_id: 4b416844010e2a04d0000001, description: "lorem?">] 
+0

Cảm ơn bạn rất nhiều. Đã khá bực bội để nói rằng ít nhất! – Garrett