2015-05-10 2 views
1

В полях в разных, но связанных таблицах одинаковые имена есть Rails 4 и они различаются. Например, если у меня есть класс Shipping и класс Receiving, где у каждого есть поле EnterTrackingNo, и они связаны между собой одной ассоциацией в поле shipping_id, будут ли какие-либо проблемы с этой настройкой/поля как-то перекрываются/мешать друг другу?В полях в разных, но связанных таблицах одно и то же имя есть Rails 4

Благодаря

+0

Нет, таких вопросов не будет. – jaspreet21anand

ответ

0

Там не будет проблемой, как Rails автоматически добавит имя таблицы в SQL запросов, которые он строит, когда это необходимо. Вы легко сможете получить доступ к атрибуту либо как shipping.EnterTrackingNo, receiving.EnterTrackingNo, shipping.receiving.EnterTrackingNo, receiving.shipping.EnterTrackingNo и т. Д., И Rails знает, из какой таблицы вы говорите, из-за того, как они написаны.

Даже при поиске объекта, скажем, вы хотите, чтобы найти все отгрузок с пункта получающего, который имеет EnterTrackingNo == 3 вы могли бы сделать

Shipping.includes(:receiving).where(receiving: { EnterTrackingNo: 3 }) 

Единственное, что нужно иметь в виду, что если вы используете SQL-фрагменты (например, запись в качестве строки), вы ДОЛЖНЫ записать его как имя_таблицы., Иначе вы получите SQLException: ambiguous column name. Например:

Shipping.includes(:receiving).where("EnterTrackingNo = 3").references(:receivings) 

не будет работать, как Rails, и вашей БД, нет никакого способа узнать, какие EnterTrackingNo вы говорите. Вы должны были бы написать:

Shipping.includes(:receiving).where("receivings.EnterTrackingNo = 3").references(:receivings) 

Таким образом, они знают, вы хотите атрибут Receiving модели.

Вы также заметите, что я добавляю references(:table_name) к тем, у которых есть фрагменты SQL. Это необходимо, так как Rails не может сказать, что ему требуется соединение, когда вы просто передаете ему строку.

+0

Удивительный, спасибо @Mario. Я уже включил это в свое приложение rails и, похоже, работал нормально, но я начал задаваться вопросом, не вызовет ли он какие-то неожиданные ошибки. –