#ruby-on-rails #ruby-on-rails-3 #oracle #activerecord #factory-bot
#ruby-on-rails #ruby-on-rails-3 #Oracle #activerecord #factory-бот
Вопрос:
У меня есть тестовая таблица Oracle со столбцом ID, который не является первичным ключом, не является автоинкрементом и не имеет определенной последовательности. Он только NOT NULL
определен. Соответствующая структура в схеме разработки представляет собой представление Oracle, а не таблицу с первичным ключом, определенным для столбца ID.
Мое заводское определение выглядит так:
FactoryGirl.define do
factory :model do
id 'abc'
end
end
Эти тесты завершаются неудачно
test "should build model 1" do
w = FactoryGirl.build(:model)
assert_not_nil w.id #fails - id is always nil
end
test "should build model 2" do
w = FactoryGirl.build(:model, :id => 'abc')
assert_not_nil w.id #fails - id is always nil
end
Я добавил attr_accessible :id
в свою модель (на всякий случай), но безуспешно.
Я также определил id=
метод в своей модели def id= id; @id = id; end
. Выполняется вызов метода и записывается @id, но похоже, что он перезаписывается позже в стеке вызовов (между FactoryGirl и ActiveRecord).
Обычно назначаются другие атрибуты.
Ответ №1:
Я нашел виновника:
write
Метод в ActiveRecord::AttributeMethods::Write
модуле имеет строку attr_name = self.class.primary_key if attr_name == 'id'
Это означает, что если имя атрибута, которое нужно установить, имеет имя ‘id’, выберите primary_key в качестве имени атрибута, которому нужно присвоить новое значение. И поскольку в моей тестовой таблице нет primary_key, возвращаемого oracle_enhanced_adapter (по праву), вся операция записи пропускается.
Мое решение состояло в том, чтобы переопределить write
метод, пропускающий эту строку, чтобы идентификатор был записан.
Ответ №2:
Что, если вы явно задаете первичный ключ? С set_primary_key nil
Просто мысль; надеюсь, вам не нужно переопределять метод записи.