#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}'
Я не уверен, лучшее это решение или нет, но, похоже, оно работает.