我有一个带有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之间)。
通常会分配其他属性。
答案 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方法。