Mongoid :: Ошибки :: MixedRelations - PullRequest
       4

Mongoid :: Ошибки :: MixedRelations

3 голосов
/ 09 декабря 2011

У меня есть пользовательская модель, встраивающая " один ко многим " Списки наблюдения, подобные следующим:

class User 
  include Mongoid::Document

  field :uid
  field :name     
  field :user_hash

  embeds_many :watchlists
end


class Watchlist
  include Mongoid::Document

  field :html_url
  field :description

  #field :name
  field :fork_, :type => Boolean

  field :forks, :type => Integer
  field :watchers, :type => Integer

  field :created_at, :type => DateTime
  field :pushed_at, :type => DateTime

  field :avatar_url

  embedded_in :user
  has_and_belongs_to_many :tags
end

Список наблюдения также должен ссылаться на многие ко многим Модель тега и наоборот:

class Tag
  include Mongoid::Document
  field :name, type: String

  has_and_belongs_to_many :watchlists
end

В любом случае, это вызывает ошибку и кажется, что такое «смешанное» отношение невозможно:

Mongoid::Errors::MixedRelations (Referencing a(n) Watchlist document from the Tag document via a relational association is not allowed since the Watchlist is embedded.):
 app/controllers/home_controller.rb:53:in `tagging'

ОБНОВЛЕНИЕ Обратите внимание, что список наблюдения должен быть отброшен (user.watchlists.clear), а не создан заново (user.watchlists.find_or_create_by) четыре раза в день, в то время как теги / теги должны быть постоянными, связывая те же встроенные списки наблюдения, что и раньше (.. Я не уверен, что это возможно в любом случае из-за предыдущего выпадения / создания).

ОБНОВЛЕНИЕ ОБНОВЛЕНИЯ (танки для поддержки durran ) Нет, этоневозможно: если вы очистите встроенные документы, идентификаторы также исчезнут, и новые будут генерироваться каждый раз, когда вы создаете новый.

Есть ли у вас какие-либо идеи о том, как их преодолеть?Лучше ли разделить все три модели в ссылочных отношениях (три разных коллекции)?

Ответы [ 2 ]

5 голосов
/ 09 декабря 2011

В mongoid вы не можете иметь ссылки на внедренные документы. Таким образом, проблема в том, что в вашей модели тегов есть определение habtm. Вы можете иметь HABTM во встроенных списках наблюдения, без каких-либо обратных связей.

class User 
  include Mongoid::Document
  embeds_many :watchlists
end

class Watchlist
  include Mongoid::Document
  embedded_in :user
  has_and_belongs_to_many :tags, inverse_of: nil
end

class Tag
  include Mongoid::Document
end

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

2 голосов
/ 09 декабря 2011

Не тот ответ, который вы ищете, но ... для чего бы это ни стоило, всякий раз, когда я использовал отношения HABTM в mongoid, они либо глючили, либо не работали.Я не знаю, было ли это исправлено, но если вы придерживаетесь только использования массивов в моделях, а также с обратной стороны отношения, вы должны быть золотыми.Это в значительной степени то, что код будет делать для вас в любом случае.

Да, вам нужно проделать немного больше работы, чтобы поддерживать отношения, но на самом деле это работает так, как должно.

Удачи.

...