访问关联如何更改字段值



今天,我们的RubyonRails应用程序中出现了一个错误。不知怎的,我们的设备模型的awsacount_id字段得到了";标记为更改";每当我们通过设备模型访问awsvpc关联时。

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

您可能会注意到;dev.changes";方法返回一个在记录";变更12";以及";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]}

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

belongs_to:awscount,inverse_of::devices,可选:truebelongs_to:awsvpc,inverse_of::devices,可选:真

Awsvp.rb

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

Awascount.rb

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

正如您所看到的,Awsvpc模型应该使用inverse_of:Awsvpc一旦改变,一切都如预期。

最新更新