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

时间:2015-03-11 05:29:44

标签: ruby-on-rails ruby activerecord associations one-to-many

我对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的问题。我似乎无法掌握这些概念,并且很难看到他们如何能够帮助或适用于我的情况。有人可以向我解释如何解决这个问题以及我究竟做错了什么。如果这个问题是重复的,请指出我正确的方向,我将删除它。

2 个答案:

答案 0 :(得分:1)

您的代码存在的问题是,您要更新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是一个模块,负责在保存父级时自动保存相关记录。

我没有尝试,但它应该与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