Двусторонний внешний ключ ActiveRecord.

#ruby-on-rails #database #activerecord #foreign-keys #associations

#ruby-on-rails #База данных #activerecord #внешние ключи #ассоциации

Вопрос:

Я использую некоторые открытые правительственные данные в MYSQL, которые я импортировал в свое приложение rails.

Я расширил базу данных некоторыми своими собственными таблицами и использую идентификаторы столбцов, предоставленные rails, в своих таблицах.

Однако таблицы исходной базы данных связаны через уникальный идентификатор ‘ndb’.

Я думал, что путем перекрестных ссылок на две :foreign_key=>'ndb' модели я получу таблицы, связанные должным образом, но через :foreign_key это, похоже, связывает идентификатор из одной таблицы в столбец ndb другой.

Мои модели выглядят следующим образом

класс Food < ActiveRecord::Base 
has_many :веса, :foreign_key=>'ndb' 
has_many :food_names 
завершение

вес класса < ActiveRecord::Base 
принадлежит к :food, :foreign_key=>'ndb'

Есть ли способ указать, что столбец ‘ndb’ является связующим звеном между таблицей food и weights, а не food_id для ndb?

Ответ №1:

Вы пробовали set_primary_key 'ndb' в своих классах AR?

set_primary_key документы.

Комментарии:

1. Я этого не пробовал, но мне все еще нужно использовать поля _id в других запросах, поскольку не все связано через это поле ‘ndb’, что я имел в виду, говоря «расширил базу данных, чтобы использовать некоторые из моих собственных таблиц», поэтому в 70% случаев я использую стандартные идентификаторы rails, но иногда мне нужно связать ‘ndb с ndb’

2. Что ж, использование set_primary_key для тех таблиц, которым это необходимо, станет началом, позволяющим работать таким вещам, как find() . Он также установит значения по умолчанию для ассоциаций.

3. Извините, возможно, я не совсем ясно выражаюсь. Для чего-то вроде таблицы food я использую поле id в 70% случаев (придерживаясь стандартов rails), остальные 30% времени мне нужно связать эту таблицу foods с другой таблицей, например weights, через поле ndb. Установка set_primary_key в модели нарушает 70% этих взаимосвязей. если я не упускаю что-то еще. Как только я устанавливаю ‘ndb’ в качестве первичного ключа, я, похоже, не могу соединить две таблицы с id с food_id

Ответ №2:

Что я сделал в качестве возможного временного решения, так это использовал :finder_sql для связывания таблиц вместе.

Моя модель Food теперь имеет:

класс Food < ActiveRecord::Base 
 has_many :weights, :finder_sql =>'Выберите веса.* ИЗ весов СЛЕВА ПРИСОЕДИНИТЕ продукты К foods.ndb=weights.ndb ГДЕ foods.id =#{id}'

Я не уверен, лучшее это решение или нет, но, похоже, оно работает.