带有Oracle增强适配器的FactoryGirl - 未分配名称为“id”的属性

时间:2011-10-18 14:02:50

标签: ruby-on-rails ruby-on-rails-3 oracle activerecord factory-bot

我有一个带有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,但看起来它稍后在callstack中被覆盖(在FactoryGirl和ActiveRecord之间)。

通常会分配其他属性。

2 个答案:

答案 0 :(得分:0)

我找到了罪魁祸首:

write模块中的ActiveRecord::AttributeMethods::Write方法有attr_name = self.class.primary_key if attr_name == 'id'

这意味着如果要设置的属性名称具有“id”的名称,请选择primary_key作为要为其分配新值的属性的名称。因为在我的测试表中没有oracle_enhanced_adapter返回的primary_key(正确地),所以跳过了整个写操作。

我的解决方案是覆盖跳过该行的write方法,以便写入id。

答案 1 :(得分:0)

如果您明确设置主键怎么办?使用set_primary_key nil

只是一个想法;希望你不需要覆盖write方法。