2010-11-08 42 views
6

Tôi cần người dùng có thể trở thành người hâm mộ của những người dùng khác. Làm thế nào tôi nên thiết kế/thiết lập này?Hướng dẫn: Người dùng có người hâm mộ

Tôi cần có thể xem chi tiết người hâm mộ của người dùng.

Ví dụ: Tôi có người dùng: Foo. Foo có 3 người hâm mộ. Tôi muốn có thể tìm thấy tên của các fan của Foo. Như vậy:

foo = User.first 
foo.name (returns 'Foo') 
foo.fans.first.user.name (should return 'bar', since 'bar' is a fan of 'foo') 

Đây là cách tôi đã thiết lập nó vào lúc này:

User model: 
    embeds_many :fans 
    references_many :fans 

Fan model: 
    embedded_in :user, :inverse_of => :fans 
    referenced_in :user 

In console, I do: 
    User.first.fans.create!(:user => User.first) 

và tôi nhận được: Mongoid :: lỗi :: InvalidCollection: Truy cập vào bộ sưu tập cho Fan là không được phép vì đây là tài liệu được nhúng, vui lòng truy cập bộ sưu tập từ tài liệu gốc. Tôi nghĩ rằng vấn đề là, bởi vì mô hình quạt được nhúng vào trong mô hình người dùng có tự tham chiếu đến mô hình người dùng ....

Suy nghĩ của bạn sẽ được đánh giá cao.

Trả lời

9

Làm thế nào về một hiệp hội tự tham chiếu:

class User 
    include Mongoid::Document 
    references_many :fans, 
        :class_name => 'User', 
        :stored_as => :array, 
        :inverse_of => :fan_of 

    references_many :fan_of, 
        :class_name => 'User', 
        :stored_as => :array, 
        :inverse_of => :fans 
end 

# let's say we have users: al, ed, sports_star, movie_star  
sports_star.fans << al 
movie_star.fans << al 
sports_star.fans << ed 
movie_star.fans << ed 

movie_star.fans # => al, ed 
al.fan_of  # => sports_star, movie_star 

Vấn đề là bạn đang cố gắng để làm gắn quan hệ sử dụng các văn bản chỉ nhúng. Khi bạn có một Fan được nhúng bên trong một User, bạn chỉ có thể truy cập vào số Fan thông qua số gốc User. Bạn không thể làm điều gì đó như Fan.find(some_id) vì không có bộ sưu tập nào của các bản ghi Fan.

Cuối cùng, MongoDB sẽ hỗ trợ các bộ sưu tập ảo cho phép bạn thực hiện việc này. Bây giờ, bạn phải sử dụng các liên kết kiểu quan hệ. Nếu bạn muốn sử dụng các tài liệu nhúng trong trường hợp này, bạn phải tạo một số phương thức tùy chỉnh xấu xí và không hiệu quả để tìm kiếm thông qua các bản ghi cha.

Với MongoDB và Mongoid, tôi thấy rằng bạn có thể dễ dàng chuyển đổi giữa các liên kết nhúng và quan hệ. Các mối quan hệ kiểu SQL và các mối quan hệ nhúng đều có vị trí của chúng và có thể được sử dụng cùng nhau để có hiệu quả lớn.

+0

User.first.fans << User.last trả về Mongo :: OperationFailure: truy vấn không hợp lệ –

+1

Bạn không thể sử dụng 'first' và' last' như thế, và bạn không thể sửa đổi các liên kết tại chỗ như thế. Thông thường, 'User.last' sẽ trả về cùng một thứ với' User.first'! Bạn cần phải làm 'u = User.all.entries.first; u2 = User.all.entries.last; u.fans << u2'. Tôi chỉ thử nghiệm mã này một lần nữa và nó hoạt động cho tôi. – bowsersenior

+0

Và điều này sẽ cho phép tôi có người dùng trở thành một fan hâm mộ của mình là tốt? –

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