Mongoid 1..N多态参考关系

时间:2011-07-07 21:23:01

标签: ruby mongodb mongoid

我有以下型号

class Track
  include Mongoid::Document
  field :artist, type: String
  field :title, type: String
  has_many :subtitles, as: :subtitleset
end

class Subtitle
  include Mongoid::Document
  field :lines, type: Array
  belongs_to :subtitleset, polymorphic: true
end

class User
  include Mongoid::Document
  field :name, type: String
  has_many :subtitles, as: :subtitleset
end

在我的ruby代码中,当我创建一个新的Subtitle时,我正在适当的Track和User中推送它:

Track.find(track_id).subtitles.push(subtitle)
User.find(user_id).subtitles.push(subtitle)

问题是它只能在用户中推送,而不是在Track中推送。但是,如果我删除第二行,它会将其推送到Track。那么为什么不同时为两者工作?

我在Subtitle文档中得到了这个:

"subtitleset_id" : ObjectId( "4e161ba589322812da000002" ),
"subtitleset_type" : "User"

1 个答案:

答案 0 :(得分:2)

如果一个字幕属于某个东西,它有一个指向那个东西的ID。副标题不能同时属于两个人。如果属性是多态的,则字幕可以属于未指定类的东西 - 但它仍然不能同时属于两个东西。

你想:

class Track
  include Mongoid::Document
  field :artist, type: String
  field :title, type: String
  has_many :subtitles
end

class Subtitle
  include Mongoid::Document
  field :lines, type: Array
  belongs_to :track
  belongs_to :user
end

class User
  include Mongoid::Document
  field :name, type: String
  has_many :subtitles
end

然后你将能够:

Track.find(track_id).subtitles.push(subtitle)
User.find(user_id).subtitles.push(subtitle)