Нужна ли мне таблица соединений для ассоциации has_many: through?

Раньше я создавал только ассоциацию has_and_belongs_to_many, и она отличается от has_many: through. Нужна ли мне таблица соединений для has_many: через ассоциацию? Как работает настоящая ассоциация? Нужен ли мне индекс? Я не могу найти отличный учебник по этому поводу, есть предложения?


person Matthew Berman    schedule 13.10.2011    source источник


Ответы (2)


Да, вам нужен соединительный стол. Здесь показано, как: http://railscasts.com/episodes/47-two-many-to-many

Это также может быть полезно; has_many: через вопросы

Кстати, если вам нужно выполнить поиск с условием, это поможет: Имеет много сквозных ассоциаций с условиями

Также отличный пример с кодом редактирования вложенных атрибутов объединенной таблицы в Вложенная форма Rails с has_many: through, как редактировать атрибуты модели соединения?.

Все это то, чем вы, возможно, захотите заняться :)

Индекс не является обязательным и также зависит от db. Раньше mySQL поддерживал только 1 за раз. Не уверен, что это изменилось.

person Michael Durrant    schedule 13.10.2011
comment
Окей круто. Я смотрел телеканал об этом. Я немного сбит с толку - он явно создал объединенную таблицу с миграцией или создал has_many через модели, а затем db: migrate автоматически создал объединенную таблицу? - person Matthew Berman; 14.10.2011
comment
Таблицы не создаются, если это не указано в файле миграции или схемы. - person bricker; 14.10.2011
comment
Итак, создавая модель соединения и затем выполняя миграцию ... что создает таблицу соединения? Или мне все еще нужно выполнить вещь rails g migration events_model_join? - person Matthew Berman; 14.10.2011
comment
да, запустите generate для модели и включите или добавьте атрибуты в миграцию, а затем rake db: migration, чтобы фактически создать модель базы данных. миграция для создания - person Michael Durrant; 14.10.2011
comment
... таблица базы данных. Проблема, о которой вы можете подумать, заключается в том, что, если таблица соединений не указана явно в качестве опции, она определяется с использованием лексического порядка имен классов. Таким образом, объединение между Developer и Project даст имя таблицы соединения по умолчанию «developers_projects». Кроме того, таблица соединений для habtm не должна иметь связанный с ней первичный ключ или модель. Вы должны вручную сгенерировать соединительную таблицу с миграцией. - person Michael Durrant; 14.10.2011

Это зависит от того, как вы хотите использовать отношение has_many :through. Есть два разных случая (названных в руководстве по отношениям

  1. для отношения n: m: пример в руководстве - врачи записываются на прием к пациентам.
  2. для отношения 1: n и дополнительного отношения 1: n: пример в руководстве: 1 документ имеет много разделов, а 1 раздел - много абзацев.

Для первого вам понадобится соединительная таблица, вам не нужен индекс. Для второго вам их не нужно.

person mliebelt    schedule 13.10.2011
comment
Я бы не сказал, что во втором примере таблица соединений не нужна. С технической точки зрения разделы - это таблица соединения между документом и абзацами, хотя странно думать об этом как о таблице соединения. - person bricker; 14.10.2011
comment
Все, что я хотел сказать, зависело от использования has_many :through, нужна вам таблица соединений или нет. Если в документе много разделов, а в каждом разделе много абзацев, вы сначала создали модели независимо, а затем добавили в модели отношения has_many и belongs_to. Позже вы добавите ярлык has_many :through, чтобы получить все абзацы прямо из документа. Я бы не назвал таблицу разделов таблицей соединений, но из кода видно отношение has_many :through. - person mliebelt; 14.10.2011