莫名其妙的错误,其中 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。