2017-01-13 2 views
0

Доброго день всем,рельсы ссылки: положить ассоциации на заливе

Вместо того, чтобы делать весь «BELONGS_TO» и «HAS_MANY» отношения между непосредственно связанными моделями, я соединил их всех, добавляя тонны ссылок.

Мое понимание состоит в том, что единственное различие является семантическим - однако семантика очень важна, и учитывая, что я новичок в рельсах (и новых для программирования в целом) и учитывая, что я влюбился в внешние ключи (< 3 реляционных баз данных), я боюсь, я, возможно, запятнал свою базу данных (: gasp). В общем, у меня есть 2 вопроса: 1. Каковы препятствия для его сохранения? и 2. Как я могу изменить его?

Я экспериментировал с изменением его с помощью следующих шагов (для некоторых из миграций, а не для всех), я хотел иметь что-то, чтобы сравнить с ними. 1. удаленный файл миграции -> 2. добавлено соответствующее имя принадлежит_to/has_many ассоциации в файле модели, 3. rails db: migrate. Однако, похоже, это ничего не изменило.

Любое понимание будет оценено по достоинству. Благодаря!

ответ

0

Я предполагаю, что когда вы говорите «ссылки», вы говорите о внешних ключах в db. Чтобы все было правильно, вам действительно нужны как внешние ключи , так и ассоциации макросов. (принадлежит_to, has_many и т. д.)

Эти две работы на разных уровнях. Внешние ключи устанавливают отношения в вашей реляционной базе данных, сообщая ему, что когда запросы поступают в db, он может рассчитывать использовать эти столбцы для поиска записей в другой таблице. (Фактически, при использовании в миграциях .references все, что вы говорите, заключается в том, что база данных должна создавать несколько столбцов в таблицах, имена которых соответствуют определенному шаблону. Rails не указывает, что они должны быть созданы как соответствующие внешние ключи SQL по умолчанию.) Это означает, что ссылки влияют только на столбцы базы данных.

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

+0

Отличный ответ! Я никогда не считал, что «база данных» и «Rails» работают как отдельные объекты, хотя с ретроспективностью это имеет большой смысл. «чьи имена следуют определенной схеме» проливает свет на то, почему «rails db: migrate» выбрасывал ошибки, когда я пытался использовать нетрадиционно-именный первичный ключ одной таблицы (таблица «Annotation», pk: «selected», error: no отношение «selecteds») для «добавления ссылок» этого столбца в качестве внешнего ключа другой таблицы. Я должен вручную добавить внешний ключ в файл миграции. Еще раз спасибо - un saludo – michaelsking1993

0

Когда вы говорите, что вы подключили их все, добавив тонны references, это звучит так, как будто в процессе миграции, тогда как belongs_to и has_many? Предполагая, что это так, вы действительно должны использовать оба варианта. Наличие внешнего ключа в базе данных - это абсолютно правильный дизайн, но вам все равно нужно иметь ассоциации, указанные в модели, чтобы сообщить Rails, что он существует!

+0

Gotcha! Не думал, что они оба являются вариантом. Спасибо за помощь!! – michaelsking1993

Смежные вопросы