Rails: оракул set_sequence_name игнорируется - PullRequest
4 голосов
/ 27 августа 2011

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

Также, поскольку она использует базу данных oracle, я задаю имя последовательности, чтобы иметь возможность автоматически увеличивать идентификаторы.

Когда я запускаю консоль rails и пытаюсь создать свою модель, она возвращается и говорит, что последовательность не найдена.Странная часть - это последовательность, которую он не может найти, это не та последовательность, которую я установил в set_sequence_name.

Модель

class Survey < ActiveRecord::Base
  set_sequence_name "SURVEY.SQ_SURVEY_ID"
  set_table_name "SURVEY.SURVEYS"
end

Ошибка консоли

ActiveRecord::StatementInvalid: ActiveRecord::JDBCError: ORA-02289: 
sequence does not exist: select SURVEY.SURVEYS_seq.nextval id from dual

Похоже, это игнорирует мою строку имени последовательности набора.

Я что-то пропустил?

Ответы [ 2 ]

4 голосов
/ 25 января 2012

FWIW: Используя 11g, мне это удалось:

self.id = ActiveRecord::Base.connection.execute("select SURVEY.SQ_SURVEY_ID.nextval id from dual").fetch

Похоже, что в моем случае последовательность возвращает курсор, на котором мне нужно сделать выборку.

11g/ Рельсы 3.1

3 голосов
/ 14 сентября 2011

Пояснение, это работает для оракула 10g

Так что, насколько я могу судить, это ошибка в адаптере jdbc (см. Здесь http://kenai.com/jira/browse/ACTIVERECORD_JDBC-133). Для работывокруг я устанавливаю идентификатор вручную с помощью фильтра перед созданием, как это:

class Survey < ActiveRecord::Base
  set_table_name "SURVEY.SURVEYS"

  before_create do
    #since we can't use the normal set sequence name we have to set the primary key manually
    #so the execute command return an array of hashes,
    #so we grab the first one and get the nextval column from it and set it on id
    self.id = ActiveRecord::Base.connection.execute("select SURVEY.SQ_SURVEY_ID.nextval id from dual")[0]["id"]
  end

end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...