Ruby Rails - 通过一对多关联访问父属性

Ruby on Rails - Accessing Parent Attribute Though One to Many Association

我在 Rails 上对 Ruby 还很陌生,在使用我在两个模型之间建立的一对多关联时遇到了问题。下面是定义一对多关联的两个模型的代码:

class Location < ActiveRecord::Base
  has_many :reviews, -> { order 'created_at DESC' }, dependent: :destroy
  has_many :share_locations, dependent: :destroy
end

class ShareLocation < ActiveRecord::Base
  belongs_to :location
end

在视图控制器中,我找到一个 ShareLocation 实例并尝试更改它所属的 Location 的属性。

@share_location = ShareLocation.find_by(share_code: share_code)

if @share_location
  @share_location.is_valid = false
  @share_location.location.owner_id = new_owner_id
  @share_location.save
end

当我更改 ShareLocation 实例的 is_valid 属性时,它会在保存时正确更新。但是,当我尝试更新 ShareLocation 所属的 Locationowner_id 时,似乎什么都没有发生。我对此很陌生,希望这个问题还没有 asked/answered。我做了一些研究,发现很多问题都提到了 nested attributes:foreign_key。我似乎无法理解这些概念,并且无法了解它们如何帮助或应用于我的情况。有人可以向我解释如何解决这个问题以及我到底做错了什么。如果这个问题是重复的,请指出正确的方向,我会删除它。

您需要的是 autosave,我认为它应该可以工作,但我刚刚查了一下

When the :autosave option is not present then new association records are saved but the updated association records are not saved

所以这就是您的更新未保存的原因,要解决此问题,您需要强制自动保存

class Location < ActiveRecord::Base
  has_many :share_locations, dependent: :destroy, autosave: true
end

您的代码存在问题,您正在更新 2 个对象:share_locationlocation,但仅保存 share_location。要保存这两个对象,您可以:

if @share_location
  @share_location.is_valid = false
  @share_location.save

  @share_location.location.owner_id = new_owner_id
  @share_location.location.save
end

或者如果您想自动保存关联模型,您可以在关联中使用 :autosave 选项:

AutosaveAssociation is a module that takes care of automatically saving associated records when their parent is saved.

我没试过,但它应该适用于 belongs_to:

class ShareLocation < ActiveRecord::Base
  belongs_to :location, autosave: true
end

有了这个,你应该能够保存父级(share_location),Rails 将自动保存关联的 location