-1

我有一个关于 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 有什么区别。

或者,当我已经有子对象并且想要将父对象链接到子对象并且不想使用子更新时,我们是否有任何解决方案。

谢谢你。

4

1 回答 1

0

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

在这个例子中:

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

即使您注释掉setteraccepts_nested_attributes_for :cod_photoscod_photo_ids=has_many :cod_photos.

在另一个示例中,您正在使用has_one您应该使用的地方,belongs_to或者只是通常对应该如何建模关联感到困惑。has_one将外键放在parking_photos桌子上。

如果你想把它parking_photo_id放在locations桌子上,你会使用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列。我真的建议您暂时忘记嵌套属性,而只是弄清楚关联如何在 Rails 中工作的基础知识。

如果你真的想建立反比关系并穿上location_idparking_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)
于 2020-10-14T08:46:01.477 回答