Rails 4 接受具有 has_one 关联的嵌套属性

Rails 4 Accept nested attributes with has_one association

我有一个关于 Rails 嵌套属性的问题。 我正在使用 Rails 4 并拥有此型号:

model Location
 has_one parking_photo
 has_many cod_photos
 accepts_nested_attributes_for :parking_photo
 accepts_nested_attributes_for :cod_photos
end

当我使用例如: Location.find(100).update(cod_photo_ids: [1,2,3]) 有效。

但是Location.find(100).update(parking_photo_id: 1)不起作用。

不知道嵌套属性has_one和has_many有什么区别。

或者当我已经有子对象并且想要 link 父对象到子对象并且不想使用子对象更新时,我们对我的情况有什么解决方案。

谢谢。

问题与嵌套属性无关。事实上,在这些示例中,您甚至根本没有使用嵌套属性。

在这个例子中:

Location.find(100).update(cod_photo_ids: [1,2,3])

即使您将 accepts_nested_attributes_for :cod_photos 注释掉也会起作用,因为 cod_photo_ids= setter 是由 has_many :cod_photos 创建的。

在另一个示例中,您在应该使用 belongs_to 的地方使用了 has_one,或者只是普遍对如何为关联建模感到困惑。 has_one 将外键放在 parking_photos table.

如果您想将 parking_photo_id 放在 locations table 上,您可以使用 belongs_to:

class Location < ActiveRecord::Base
  belongs_to :parking_photo
  # ...
end

class ParkingPhoto < ActiveRecord::Base
  has_one :location # references  locations.parking_photo_id
end 

当然,您还需要迁移才能真正添加​​ locations.parking_photo_id 列。我真的建议你暂时忘记嵌套属性,只弄清楚基础知识 of how assocations work in Rails.

如果你真的想要反向关系并将 location_id 放在 parking_photos 上,你可以这样设置:

class Location < ActiveRecord::Base
  has_one :parking_photo
  # ...
end

class ParkingPhoto < ActiveRecord::Base
  belongs_to :location
  validates_uniqueness_of :location_id
end 

您可以通过以下方式重新分配照片:

Location.find(100).parking_photo.update(location_id: 1)