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

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

Когда я запускаю консоль 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

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

Я что-то упускаю?

4
joekarl 27 Авг 2011 в 01:15

2 ответа

Лучший ответ

Уточняю, это работает для Oracle 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
3
joekarl 5 Мар 2012 в 15:16

FWIW: Используя 11g, мне сошло с рук:

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

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

11g / рельсы 3.1

4
dynex 24 Янв 2012 в 21:35