ruby-on-rails - ActiveRecord 在测试中的奇怪行为

标签 ruby-on-rails testing activerecord

我必须用关系建模:

参与有很多路过

在测试中A得到了一个奇怪的东西:

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 时,如果我通过关系模型进行查询,我会得到空集合 - 一切正常。 在开发环境中,两个查询得到相同的结果。

最佳答案

很可能 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)

如果您包括您的测试,它可能会更清楚地说明这个问题。

关于ruby-on-rails - ActiveRecord 在测试中的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37044944/

相关文章:

mysql - 无法从 Rails 更新 RDS 数据库

ruby-on-rails - 为什么默认情况下 Rails POST/PUT 格式与 GET 不同?

javascript - 如何使用 mocha.js 测试纯 JavaScript 模块

.net - 在运行时创建测试

ruby-on-rails - 向 content_tag 添加空白属性

javascript - Firefox 不处理服务器发送的事件方法

ruby-on-rails - 如何在 rails View 中显示数组?

javascript - 仅使用 'export' 关键字导入单元测试

ruby-on-rails - Rails ActiveRecord 返回相关表中存在 id 的记录

ruby-on-rails - inverse_of 在 after_initialize 内不起作用