ActiveRecord, Postgres и секционированные таблицы - PullRequest
0 голосов
/ 24 ноября 2010

Я установил схему разделения на основе триггера для одной из наших баз данных pg 8.3 в соответствии с pg docs здесь: . По сути, у меня есть родительская таблица, а также несколько дочерних таблиц. Триггер вставки родительского элемента перенаправляет любые вставки родительского элемента в соответствующую дочернюю таблицу - это работает хорошо.

Адаптер ActiveRecord pg, однако, полагается на расширение id для postgres INSERT ... RETURNING, чтобы получить идентификатор возвращаемой строки после начальной вставки. Но триггер, кажется, нарушает предложение RETURNING - идентификатор не возвращается, хотя строка создана правильно.

Хотя я полагаю, что такое поведение имеет смысл - в конце концов, ничего не вставляется в основную таблицу, мне действительно нужно найти какой-то обходной путь, так как будут вставлены другие дочерние записи, которые требуют идентификатор строки только что вставленный ряд.

Полагаю, я мог бы добавить какой-то уникальный идентификатор в строку перед вставкой, а затем перечитать его, используя этот ключ после вставки, но это выглядит довольно глупо. У кого-нибудь есть лучшее решение?

Ответы [ 2 ]

4 голосов
/ 30 сентября 2011

Начиная с Rails v.2.2.1, вы можете отключить поведение 'return id', просто переопределив метод #supports_insert_with_returning в PostgreSQLAdapter.

class ActiveRecord::ConnectionAdapters::PostgreSQLAdapter
  def supports_insert_with_returning?
    false
  end
end
0 голосов
/ 27 ноября 2010

В настоящее время похоже, что мой лучший вариант - просто изменить префикс таблицы в событии before_create, чтобы вставка происходила непосредственно в базовую таблицу разделов, минуя триггер вставки.Однако это не идеальное решение, но оно представляется наиболее эффективным и простым.

Единственное другое решение, которое я могу придумать, - это добавить столбец guid в каждую таблицу и перечитатьСтрока из таблицы разделов по guid сразу после вставки, чтобы получить идентификатор.

Любые другие предложения приветствуются.Спасибо - м

...