我有两个独立的模型,我想通过相同的关联链接到第三个共享模型。我可以有两个独立的关联表,但希望共享以简化SQL报告这个例子是假设的,以简化现实;不要打它
class Assoc < ApplicationRecord
belongs_to :part
belongs_to :car
belongs_to :truck
end
class Part < ApplicationRecord
has_many :assocs
has_many :cars, through: :assocs
has_many :trucks, through: :assocs
end
class Car < ApplicationRecord
has_many :assocs
has_many :parts, through: :assocs
end
class Truck < ApplicationRecord
has_many :assocs
has_many :parts, through: :assocs
end
当前保存卡车或汽车时失败。我不知道为什么car.errors
没有透露任何信息。据猜测,该关联可能需要3个ID,而我只希望它有零件和汽车或卡车,但不是全部三个。上面的模型转换为具有以下模式的SQL表:
assocs
列 | 类型 | 示例数据 | |
---|---|---|---|
id | bigint | <1,2,3>||
part_id | bigint | <1,2,3>||
car_id | bigint | <1,2,3>||
truck_id | bigint | <1,2,3>
基于我上面的假设,我测试了关联模型,并使汽车/卡车在关联上是可选的,这起到了作用:
class Assoc < ApplicationRecord
belongs_to :part
belongs_to :car, optional: true
belongs_to :truck, optional: true
end
我认为这现在需要一个验证器来检查car_id
或truck_id
的存在。我还没有实现它,但我认为Assoc应该包括这样的东西:
class Assoc < ApplicationRecord
belongs_to :part
belongs_to :car, optional: true
belongs_to :truck, optional: true
validates :car_id, presence: true, unless: :truck_id
validates :truck_id, presence: true, unless: :car_id
end