【问题标题】:Need some help with MongoID and many-to-many relation在 MongoID 和多对多关系方面需要一些帮助
【发布时间】:2011-03-01 10:59:40
【问题描述】:

使用 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 =&gt; :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)

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

【问题讨论】:

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


    【解决方案1】:

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

    references_and_referenced_in_many :worlds

    在 beta 20 中,您使用 :stored_as => :array 走在了正确的轨道上。尝试像这样设置默认值,它应该适合你。

    references_many :worlds, :stored_as =&gt; :array, :default =&gt; []

    【讨论】:

      【解决方案2】:

      对于 MongoID,我相信您可能必须在使用 earth.users &lt;&lt; someone 之类的内容修改文档后显式地 earth.save 才能保留对“文档”的更改。

      【讨论】:

      • 我在控制器中显式调用save(控制器只使用一个实例,因此没有其他方法)
      猜你喜欢
      • 2010-12-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-12-10
      • 2010-12-16
      • 2011-03-17
      相关资源
      最近更新 更多