Монгоидные циркулярные ссылки - PullRequest
0 голосов
/ 07 октября 2011

Итак, у меня есть проблема с циклической ссылкой, которую я не знаю, как ее решить. Таким образом, ситуация такова, что у пользователя есть возможность ввести список нескольких фильмов для актеров в текстовое поле. Текст хранится в виртуальном атрибуте, анализируется и передается моделям в обратном вызове сохранения модели. В идеале я не хотел бы менять структуру моделей, потому что это имеет смысл на английском языке и кажется очень нормальным с точки зрения базы данных.

Вот структура:

require 'mongoid'
require 'mongo'

class Actor
  include Mongoid::Document

  field :name
  attr_accessible :user_input_films
  attr_accessor :user_input_films

  before_save :assign_films

  embeds_one :filmography
  belongs_to :cast

  def assign_films
    if user_input_films == nil
      return
    end

    user_input_films.split(" ").each do |film|
      film = Film.first(conditions: { :name => film})
      if film == nil
        film = Film.new(:name => film)
        film.build_cast
        film.save!
      end
      self.filmography.add_film(film)
    end
  end
end

class Filmography
  include Mongoid::Document

  has_many :films
  embedded_in :actor

  def add_film(film)
    films << film
    film.cast.actors << self.actor
  end
end

class Film
  include Mongoid::Document

  field :name
  embeds_one :cast
  belongs_to :filmography
end

class Cast
  include Mongoid::Document

  embedded_in :film
  has_many :actors
end

Mongoid.configure do |config|
  config.master = Mongo::Connection.new.db("mydb")
end

connection = Mongo::Connection.new
connection.drop_database("mydb")
database = connection.db("mydb")

actor = Actor.new
actor.build_filmography
actor.user_input_films = "BadFilm1 BadFilm2"
actor.save
puts "actor = #{actor.attributes}"
actor.filmography.films.each do |film|
  puts "film = #{film.attributes}"
end

Таким образом, структура: Актер владеет Фильмография , которая ссылается на многие Фильмы . И Фильм владеет В ролях , который ссылается на многих Актеров . И проблема происходит в строке:

film.cast.actors << self.actor

потому что актер снова сохраняется с помощью оператора << и круговая логика повторяется </p>

И, как все догадались, ошибка:

/home/greg/.rvm/gems/ruby-1.9.2-p290@rails31/gems/mongoid2.2.1/lib/mongoid/fields.rb:307: stack level too deep (SystemStackError)

Так как же сохранить свой документ без переполнения стека круговой ссылки?

UPDATE: Одна мысль, я думаю, что грязное решение было бы способом добавления ссылки без сохранения ссылочного объекта.

Спасибо

...