FactoryGirl с расширенным адаптером Oracle - атрибут имени id не назначен - PullRequest
0 голосов
/ 18 октября 2011

У меня есть тестовая таблица Oracle со столбцом ID, который не первичный ключ, не автоинкремент и с определенной последовательностью no .Определено только 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).

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

Ответы [ 2 ]

0 голосов
/ 04 ноября 2011

Что если вы явно установите первичный ключ? С set_primary_key nil

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

0 голосов
/ 18 октября 2011

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

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

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

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

...