我需要用户能够成为其他用户的粉丝。我应该如何设计/设置?

我需要能够查看用户粉丝的详细信息。

例如。我有用户:Foo。 Foo有3个粉丝。我希望能够找到Foo粉丝的名字。因此:

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

这是我目前设置的方式:
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)

我得到:
Mongoid::Errors::InvalidCollection:由于Fan是嵌入式文档,因此不允许访问Fan的集合,请从根文档访问集合。 我认为问题是,因为风扇模型嵌入在用户模型中,而用户模型也具有对用户模型的自引用...。

您的想法将不胜感激。

最佳答案

自我参照关联如何:

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

问题是您试图仅使用嵌入式文档进行关系关联。当您在Fan中嵌入了User时,您只能通过其父Fan访问User。您无法执行Fan.find(some_id)之类的操作,因为没有Fan记录的集合。

最终,MongoDB将支持允许您执行此操作的虚拟集合。现在,您必须使用关系类型关联。如果要在这种情况下使用嵌入式文档,则必须创建一些难看且效率低下的自定义方法来搜索父记录。

使用MongoDB和Mongoid,我发现您可以轻松地在嵌入式和关系关联之间进行切换。 SQL类型的关系和嵌入的关系都有其位置,可以一起使用以产生很大的效果。

关于mongodb - : User has fans的使用方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4128163/

10-12 17:15