FactoryGirl с Oracle enhanced adapter — атрибут имени ‘id’ не назначен

#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

Просто мысль; надеюсь, вам не нужно переопределять метод записи.