莫名其妙的错误,其中 FactoryGirl 对象的数据不正确,但仅限于本地
Baffling error where FactoryGirl object has incorrect data, but only locally
这让我和办公室里的其他人都感到困惑。
我有一个这样的工厂女孩插入:
@data = FactoryGirl.create(:'database/table',
:packagemember_tp => 3
)
puts 'kanga'
puts @data.packagemember_tp
puts 'kanga'
看起来不错,但是打印出来的日志是这样的:
kanga
2
kanga
无论我告诉它插入什么值,值始终是 2。
您可能会认为如果我打开 Factory 会有一些奇怪的默认值或其他东西,但事实并非如此:
FactoryGirl.define do
factory :'database/table' do
end
end
那你可能会想,也许 table DDL 是一种奇怪的数据类型,但事实并非如此:
PackageMember_Tp SMALLINT NOT NULL DEFAULT 0 ,
然后你想,让我们在那里放一个断点并检查对象,看看真正的价值是什么:
@values = Hash (17 element(s))
...
packagemember_tp => 2
最后你想,好吧,让我们再次检查日志以获取实际的 SQL 插入语句并查看正在插入的数字?
INSERT INTO database.table (PACKAGEMEMBER_TP) VALUES (3)
这是怎么回事?
为什么此列的所有值都被转换为 2,但仅在本地 FactoryGirl 对象中?
终于找到错误了
因此,table 的主键不是唯一的。
FG 执行插入后,它 sel top 1 * from table
使用您指定的主键。
由于该键不是唯一的,因此 table 中还有其他行具有该值。
返回了其中一行,恰好该列中有一个 2。
这让我和办公室里的其他人都感到困惑。
我有一个这样的工厂女孩插入:
@data = FactoryGirl.create(:'database/table',
:packagemember_tp => 3
)
puts 'kanga'
puts @data.packagemember_tp
puts 'kanga'
看起来不错,但是打印出来的日志是这样的:
kanga
2
kanga
无论我告诉它插入什么值,值始终是 2。
您可能会认为如果我打开 Factory 会有一些奇怪的默认值或其他东西,但事实并非如此:
FactoryGirl.define do
factory :'database/table' do
end
end
那你可能会想,也许 table DDL 是一种奇怪的数据类型,但事实并非如此:
PackageMember_Tp SMALLINT NOT NULL DEFAULT 0 ,
然后你想,让我们在那里放一个断点并检查对象,看看真正的价值是什么:
@values = Hash (17 element(s))
...
packagemember_tp => 2
最后你想,好吧,让我们再次检查日志以获取实际的 SQL 插入语句并查看正在插入的数字?
INSERT INTO database.table (PACKAGEMEMBER_TP) VALUES (3)
这是怎么回事?
为什么此列的所有值都被转换为 2,但仅在本地 FactoryGirl 对象中?
终于找到错误了
因此,table 的主键不是唯一的。
FG 执行插入后,它 sel top 1 * from table
使用您指定的主键。
由于该键不是唯一的,因此 table 中还有其他行具有该值。
返回了其中一行,恰好该列中有一个 2。