Нужна помощь с полиморфным соединением таблицы в рельсах - PullRequest
2 голосов
/ 18 сентября 2009

Здравствуйте, я пытаюсь связать две сущности с одной сущностью, которая является управляющим органом, сословием и repo_document, тогда у руководящего органа может быть repo_document, который также может быть у поместья, поэтому я решил создать таблицу соединений с именем document_owner ... но я не знаю, что написать в их моделях ... у меня есть этот код в моей модели document_owner ..

belongs_to :repo_document
belongs_to :estate, :through => :repo_document, :foreign_key => :owner_id, :conditions => "owner_type = 'Estate'"
belongs_to :governing_body, :through => :repo_document, :foreign_key => :owner_id, :conditions => "owner_type = 'GoverningBody'"
belongs_to :owner, :polymorphic => true

и этот в моем repo_document

 has_and_belongs_to_many :owners, :join_table => :document_owners, :conditions =>     "owner_type = 'Estate' OR owner_type = 'GoverningBody'"

а этот в моем имении

has_many :repo_documents, :source => :document_owners, :foreign_key => :owner_id, :conditions => "owner_type = 'Estate' "

и этот в моем руководящем теле

has_many :repo_documents, :source => :document_owners, :foreign_key => :owner_id, :conditions => "owner_type = 'GoverningBody' "

но когда я пытаюсь сохранить, он ничего не сохраняет внутри объединяющей таблицы ..

Кто-нибудь может мне помочь, пожалуйста

1 Ответ

5 голосов
/ 18 сентября 2009

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

Кроме того, использование has_and_belongs_to_many не рекомендуется, поскольку использование has_many: сквозное решение является гораздо лучшим решением в большинстве ситуаций.

Один из способов упростить это - объединить ваши модели Estate и Управляющего тела в одну таблицу, возможно, используя STI для различения этих двух. Таким образом, связь между документами и этой конкретной сущностью становится намного более очевидной.

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

Полиморфные ассоциации лучше всего подходят для случайных отношений, которые один ко многим. Например:

class Example < ActiveRecord::Base
  # This model has notes
  has_many :notes, :as => :record
end

class Note
  # Can be attached to any kind of record
  belongs_to :record, :polymorphic => true
end

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...