为啥 Rails 在通过关联创建新记录时不更新其关联缓存?

Posted

技术标签:

【中文标题】为啥 Rails 在通过关联创建新记录时不更新其关联缓存?【英文标题】:Why doesn't Rails update its association cache when creating new records through the association?为什么 Rails 在通过关联创建新记录时不更新其关联缓存? 【发布时间】:2017-03-30 11:22:51 【问题描述】:
class User < ActiveRecord::Base
  has_many :addresses, ->  order("created_at DESC") 
end

class Address < ActiveRecord::Base
  belongs_to :user
end

class UserTest < ActiveSupport::TestCase
  test 'should return the last address the user created' do
    user = User.create!
    user.addresses.create!(created_at: Date.today - 1.day)
    user.addresses.create!(created_at: Date.today)
    assert_equal Date.today, user.addresses.first.created_at # note that .first here should actually return the last record created, when hitting the DB, due to the ordering specified in the association scope block
  end
end

这个断言会失败(user.addresses.first.created_at 返回Date.today-1.day),而如果我在断言之前执行user.reloaduser.addresses.reset,它将成功(user.addresses.first.created_at 然后返回Date.today)。

为什么 Rails 在通过关联创建新记录时不更新其关联缓存?

我原以为使用user.addresses.create 实际上会更新用户对象上的缓存关联以及数据库记录,因为它是通过关联创建的。与使用 Address.create 不同,在这种情况下,我预计需要重新加载用户对象。

【问题讨论】:

【参考方案1】:

我认为是因为在大多数情况下它太昂贵且没有必要。我通常把这些规格写成:

assert_equal Date.today, user.addresses.reload.first.created_at

【讨论】:

以上是关于为啥 Rails 在通过关联创建新记录时不更新其关联缓存?的主要内容,如果未能解决你的问题,请参考以下文章

Ruby/Rails - 为啥自我关联条件取决于创建时间?

Rails:为啥“has_many ...,:通过=> ...”关联导致“NameError:未初始化的常量...”

更改连接表中的属性值时,Rails 5 正在插入而不是更新

如何创建与 Ember.js 和 Rails 关联的 belongsTo 记录?

通过Rails中的关联使用has_many创建新模型时出现不允许的参数错误

为啥猫鼬在更新时不验证?