Проблема с завышенными кавычками для ruby, activerecord и Composite_primary_keys в Oracle - PullRequest
1 голос
/ 20 сентября 2011

Я получаю ошибку Oracle из-за того, что SQL генерируется для связи между таблицами. Сложный первичный ключ не задействован, но эта проблема не возникала перед добавлением гема Composit_primary_keys.

Внешний ключ ассоциации добавляется в SQL следующим образом:

SELECT "FOO".* FROM "FOO"  WHERE "FOO"."Bar_id" = 1234

Столбец "bar_id" существует. Однако, когда мы помещаем «Bar_id» в кавычки таким образом, Oracle воспринимает нас всерьез и учитывает весь регистр.

Если бы мы только генерировали это:

SELECT "FOO".* FROM "FOO"  WHERE "FOO".Bar_id = 1234

или это:

SELECT "FOO".* FROM "FOO"  WHERE "FOO"."BAR_ID" = 1234

Все будет хорошо.

Вот ошибка, которую мы получаем:

ActiveRecord::StatementInvalid: NativeException: java.sql.SQLException: ORA-00904: "FOO"."Bar_id": invalid identifier

Я на самом деле исправил (читай, «взломал») это для версии 3.1.0 в файле cluster_primary_keys, но теперь, когда мне нужно перейти на 4.0.0, изменения в коде были настолько значительными, что простые хаки, которые я использовал ранее уже не так очевидны.

Есть идеи, как это исправить?

Используемые версии материала:

  • композитный_применный_кейс 4.0.0
  • activerecord 3.1.0
  • activerecord-oracle_enhanced-adapter 1.4.0
  • jruby 1.6.3

1 Ответ

0 голосов
/ 23 сентября 2011

Хорошо, я думаю Я нашел проблему. (Шляпа к mu_is_too_short за то, что я выбрал правильный путь.)

While foot.uninjured? { pull_trigger }...

Поскольку наши таблицы не следуют соглашению ActiveRecord для первичных и внешних ключей, а заканчиваются на "_seq_id" вместо простого "_id", мы написали переопределение для ActiveSupport :: Inflector.foreign_key, которое в основном демодулирует имя класса модели и прикрепляет "_seq_id" в конце. Метод демодулирования - это тот, который оставляет нам «Bar», который затем становится «Bar_seq_id».

Таким образом, обойдя весь отклоненный внешний ключ, мы можем решить эту проблему. Совершенно странно.

...