FactoryGirl с расширенным адаптером Oracle - атрибут имени «id» не назначен

У меня есть тестовая таблица Oracle со столбцом идентификатора, который не является первичным ключом, не автоинкрементом и с никакой определенной последовательностью. Определено только NOT NULL. Соответствующая структура в схеме разработки — это Oracle View, а не таблица с первичным ключом, определенным для столбца 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).

Обычно присваиваются другие атрибуты.


person tamersalama    schedule 18.10.2011    source источник


Ответы (2)


Я нашел виновника:

Метод write в модуле ActiveRecord::AttributeMethods::Write имеет строку attr_name = self.class.primary_key if attr_name == 'id'

Это означает, что если имя устанавливаемого атрибута имеет имя 'id', выберите primary_key в качестве имени атрибута, которому будет присвоено новое значение. А так как в моей тестовой таблице нет primary_key, возвращаемого oracle_enhanced_adapter (по праву), вся операция записи пропускается.

Мое решение состояло в том, чтобы переопределить метод write, пропуская эту строку, чтобы идентификатор был записан.

person tamersalama    schedule 18.10.2011

Что, если вы явно зададите первичный ключ? С set_primary_key ноль

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

person jasonkarns    schedule 04.11.2011