【问题标题】:mongoid, creating references with rolesmongoid,使用角色创建引用
【发布时间】:2011-01-20 10:12:21
【问题描述】:

我对 mongoDB 很陌生,我只是将它用于我正在从事的新 Rails 项目。 我现在想做的是,让(嵌入式)文档引用另一个集合,但角色不同。

不知何故,这似乎不起作用。我知道,我无法定义从外部集合到嵌入集合的关系。因此,就我而言,我无法从我的用户那里访问位置,我对此很好。不过,我需要定义 referenced_in :location 部分,否则当我尝试向 Place 添加新位置时会收到错误消息 undefined method 'name' for nil:NilClass

所以这只是序言。我的实际问题是,这些角色的东西似乎不起作用。当我在地点locations.create(:user_a => some_user) 中创建类似的新位置时,user_b 也被设置为该用户。

有什么办法可以让它工作吗?还是我做错了什么?

class Place
  include Mongoid::Document
  embeds_many :locations
end

class Location
  include Mongoid::Document
  embedded_in :place, :inverse_of => :locations
  references_one :user_a, :class_name => "User" #, :stored_as => :array
  references_one :user_b, :class_name => "User" #, :stored_as => :array
end

class User
  include Mongoid::Document
  referenced_in :location, :inverse_of => :dropper
  referenced_in :location, :inverse_of => :picker
end

【问题讨论】:

  • 你用的是哪个mongoid版本?
  • sry,完全忘记了:mongoid 2.0.0.beta.20 on rails 3.0.3

标签: ruby-on-rails ruby-on-rails-3 mongodb entity-relationship mongoid


【解决方案1】:

我认为您必须消除两个位置关联的歧义(因为引用存储在 referenced_in 端):

class User
  include Mongoid::Document
  referenced_in :location_a, :inverse_of => :user_a, :class_name => "Location"
  referenced_in :location_b, :inverse_of => :user_b, :class_name => "Location"
end

我不禁觉得可能有更好的方法来做到这一点......

这是更好的方法吗?

class Location
  include Mongoid::Document
  embedded_in :place, :inverse_of => :locations
  referenced_in :user_a, :class_name => "User"
  referenced_in :user_b, :class_name => "User"
end

class User
  include Mongoid::Document
end

【讨论】:

  • 嗯,第一个没用。但第二个似乎很明显。我原以为您总是需要定义references_xyz 部分,如果您希望关联可以通过两个站点导航,那么这个referenced_in 是一个可选的“附加组件”。但是我到目前为止定义的所有测试现在都通过了。所以谢谢:)