Mongoid 1..N полиморфные ссылочные отношения - PullRequest
2 голосов
/ 08 июля 2011

У меня есть следующие модели

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, когда я создаю новый субтитр, я помещаю его в соответствующий трек и пользователя следующим образом:

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

Проблема в том, что он толкается только в пользователя, а не в трек тоже.Но если я удаляю вторую строку, она выдвигается в трек.Так почему же не работает для обоих?

Я получаю это в документе Subtitle:

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

1 Ответ

2 голосов
/ 08 июля 2011

Если субтитр принадлежит чему-то, у него есть идентификатор, указывающий на это что-то.Субтитры не могут принадлежать двум вещам одновременно.Если принадлежность полиморфна, субтитры могут принадлежать чему-то, чей класс не указан - но он все равно не может принадлежать двум вещам одновременно.

Вы хотите:

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)
...