Rails has_one:通过关联:设置关联对象将删除连接对象

时间:2017-05-01 19:27:00

标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-4 associations

我有

class CarpoolGroup < ActiveRecord::Base
  has_many :cars
end

class Car < ActiveRecord::Base
  belongs_to :carpool_group
  has_many :car_types
end

class CarType < ActiveRecord::Base
  belongs_to :car
  has_one :carpool_group, through: :car
end

当我设置

car_type.carpool_group = nil

或当我保存carpool_group时,已加入的Car对象从数据库中已删除。在设置DELETE from "cars" where ...之后,我看到了SQL car_type.carpool_group = nil

如何通过关联保留has_one并避免删除?

2 个答案:

答案 0 :(得分:1)

Rails总是删除through关联的中间记录,因为Rails不将中间记录视为独立实体,而是将实体之间的连接视为连接。

在您的情况下,您有两种选择:

选项1:

直接在carpool_group = nil

上致电car
cat_type.car.carpool_group = nil

选项2:

has_one替换为delegate

class CarType < ActiveRecord::Base
  belongs_to :car
  delegate :carpool_group, to: :car, allow_nil: true
end

原始代码cat_type.carpool_group = nil不会删除汽车。

答案 1 :(得分:0)

您需要在has_one decleration

之前指定CarType与Car ..的关联
class CarType < ActiveRecord::Base
  belongs_to :car
  has_one :carpool_group, through: :car
end