ActiveRecord在测试中的奇怪行为

时间:2016-05-05 07:30:34

标签: ruby-on-rails testing activerecord

我必须建立关系模型:

参与有很多传递

在测试中有一件奇怪的事情:

participation.passings
#<ActiveRecord::Associations::CollectionProxy []>
participation.passings.to_sql
"SELECT \"passings\".* FROM \"passings\"  WHERE \"passings\".\"participation_id\" = $1  ORDER BY \"passings\".\"datetime\" ASC"

可是:

Passing.where(participation: participation)
#<ActiveRecord::Relation [#<Passing id: 8, chip_id: "0000001", datetime: "2016-05-05 07:28:53", detector_id: 1, event_id: 1, participation_id: 1, is_valid: false, location_id: nil, created_at: "2016-05-05 07:20:55", updated_at: "2016-05-05 07:20:55", gun_time: 0.0, split_time: 0.0, time: 0.0, raw_passing_id: 8, enabled: true>...]

我不明白为什么当我调用participation.passings时,如果通过关系模型进行查询,我会得到空集合 - 一切正常。 在开发环境中,两个查询都得到相同的结果。

1 个答案:

答案 0 :(得分:0)

很可能participation.passings正在提取缓存数据,而不是从数据库查询重新加载关联。

要了解为什么会发生这种情况,请假设您拥有以下内容:

participation = Participation.create
new_passing = Passing.create(participation_id: participation.id)

participation.passings # Still an empty collection

participation.passings(true).pluck(:id) == [new_passing.id] # Now returns a collection including `new_passing`

# Can also reload the collection
participation.reload

participation.passings.pluck(:id) == [new_passing.id] # Should also be true

要修复,请尝试将true传递给passings关联来强制重新加载:

participation.passings(true)

如果你包括你的测试,它可能会更清楚地解决这个问题。