我对Ruby on Rails相当新,并且在使用我在两个模型之间建立的一对多关联时遇到了问题。以下是定义一对多关联的两个模型的代码:
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
当我更改is_valid
实例的ShareLocation
属性时,它会在保存时正确更新。但是,当我尝试更新owner_id
时,Location
所属的ShareLocation
似乎没有发生。我对此非常陌生,希望这个问题还没有得到解答。我做了一些研究,发现了许多提到nested attributes
和:foreign_key
的问题。我似乎无法掌握这些概念,并且很难看到他们如何能够帮助或适用于我的情况。有人可以向我解释如何解决这个问题以及我究竟做错了什么。如果这个问题是重复的,请指出我正确的方向,我将删除它。
答案 0 :(得分:1)
您的代码存在的问题是,您要更新2个对象:share_location
和location
,但仅保存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是一个模块,负责在保存父级时自动保存相关记录。
我没有尝试,但它应该与belongs_to
:
class ShareLocation < ActiveRecord::Base
belongs_to :location, autosave: true
end
有了这个,您应该能够保存父(share_location
),Rails将自动保存关联的location
。
答案 1 :(得分:0)
你需要的是autosave
,我认为它应该有效,但我只是看了一下
当:自动保存选项不存在时,将保存新的关联记录,但不保存更新的关联记录
所以这就是为什么你的更新没有保存,为了解决这个问题,你需要强制自动保存
class Location < ActiveRecord::Base
has_many :share_locations, dependent: :destroy, autosave: true
end