0

今天,我的 Ruby-on-Rails 应用程序中出现了一个错误。不知何故,每当我们通过 Device 模型访问 awsvpc 关联时,我们的 Device 模型的 awsaccount_id 字段就会被“标记为更改”。

为了调试问题,我添加了几个日志条目和几行额外的代码(如下所示)来诊断设备模型实例是如何被标记为更改的。

您可能会注意到“dev.changes”方法在记录“changes12”和“changes2”之间返回一个挂起的更改。这些日志条目之间发生的唯一代码是访问与 dev.awsvpc.id 的关联

这个 ruby​​ 代码在什么情况下可以:

  Rails.logger.info "Update_Device changes0: #{dev.changes}"
  sample_vpc = dev.awsvpc_id
  Rails.logger.info "Update_Device changes1: #{dev.changes}"
  sample_vpc = Awsvpc.find(dev.awsvpc_id)
  Rails.logger.info "Update_Device changes12: #{dev.changes}"
  sample_vpc = dev.awsvpc.id
  Rails.logger.info "Update_Device changes2: #{dev.changes}"

导致如下所示的日志条目:

Update_Device changes0: {}
Update_Device changes1: {}
  [1m[36mAwsvpc Load (0.2ms)[0m  [1m[34mSELECT "awsvpcs".* FROM "awsvpcs" WHERE "awsvpcs"."id" = $1 LIMIT $2[0m  [["id", 644], ["LIMIT", 1]]
  ↳ app/lib/api/api_get_asset_result_builder.rb:53:in `populate_awssubnet'
Update_Device changes12: {}
  [1m[36mCACHE Awsvpc Load (0.0ms)[0m  [1m[34mSELECT "awsvpcs".* FROM "awsvpcs" WHERE "awsvpcs"."id" = $1 LIMIT $2[0m  [["id", 644], ["LIMIT", 1]]
  ↳ app/lib/api/api_get_asset_result_builder.rb:55:in `populate_awssubnet'
Update_Device changes2: {"awsaccount_id"=>[66, 644]}
4

1 回答 1

0

对于其他有此问题的人,我发现了问题。在模型中,我们有: Device.rb

belongs_to :awsaccount, inverse_of: :devices, 可选: true

awsvpc.rb

has_many :devices, :class_name => 'Device', dependent: :nullify, inverse_of: :awsaccount

Awsaccount.rb

has_many :devices, :class_name => 'Device', dependent: :nullify, inverse_of: :awsaccount

如您所见,Awsvpc 模型应该使用了 inverse_of :awsvpc 一旦更改,一切都按预期工作。

于 2021-05-05T21:08:23.840 回答