需要一些MongoID和多对多关系的帮助

时间:2011-03-01 10:59:40

标签: ruby-on-rails many-to-many mongoid

使用mongoid 2.0.0.beta.20,如果是的话。

目标很简单,但我无法得到它。我有一个User模型,

references_many :worlds, :inverse_of => :users

World,当然,

references_many :users, :inverse_of => :worlds

用人的话说,用户可以访问0..inf世界,1..inf用户可以访问世界。 World应该存储在那里的用户ID列表,用户应该存储他访问过的世界ID列表。看起来很简单,但不想为我工作。

现在,有一个User实例(让我们称呼他为someone)和两个World实例(earthmars)。当我试图说someone访问earth时,没有问题:

earth.users << someone
earth.users.count # => 1

然后,我想说someone也在mars

mars.users << someone
mars.users.count # => 1

一切都好吗?不确定:

earth.users.count # => 0
someone.worlds.count # => 0

我也尝试将:stored_as => :array参数用于关系,但根本没有成功(方向无关紧要):

someone.worlds << earth
NoMethodError: You have a nil object when you didn't expect it!
You might have expected an instance of Array.
The error occurred while evaluating nil.<<

(以及任何其他Array方法引发我尝试处理nil)

也许我错过了文档中的某些内容或做错了什么。请帮我解决这个问题。

2 个答案:

答案 0 :(得分:0)

使用MongoID我相信您可能需要在使用earth.save之类的内容修改文档后明确earth.users << someone,以便继续更改“文档”。

答案 1 :(得分:0)

如果你升级到最新的rc,那么你可以使用新的宏来做这些关系:

references_and_referenced_in_many :worlds

在测试版20中,您使用的方式处于正确的轨道:stored_as =&gt; :阵列。尝试设置这样的默认值,它应该适合你。

references_many :worlds, :stored_as => :array, :default => []