3 个表共享一个关联 table
3 Tables Share an Association table
我有两个独立的模型,我想通过相同的关联 link 到第三个共享模型。我可以有两个独立的关联 table,但我想分享以简化 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,而我只希望它具有 Part 和 Car 或 卡车,但不是全部三个。上述模型转换为具有以下架构的 SQL table:
协会
column
type
example data
id
bigint
1,2,3,...
part_id
bigint
1,2,3,...
car_id
bigint
1,2,3,...
truck_id
bigint
1,2,3,...
我认为理想情况下,我更喜欢具有数据库 class/subclass 引用的 table。没有考虑太多,像下面这样的东西,虽然它可能需要自己的问题。
column
type
example data
id
bigint
1,2,3,...
vehicle_id
bigint
1,2,3,...
vehicle_type
text
Car or Truck; the field could also be called table_name with cars or trucks being the value
根据我上面的假设,我测试了关联模型并在关联上将 car/truck 设置为可选,这有效:
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
我有两个独立的模型,我想通过相同的关联 link 到第三个共享模型。我可以有两个独立的关联 table,但我想分享以简化 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,而我只希望它具有 Part 和 Car 或 卡车,但不是全部三个。上述模型转换为具有以下架构的 SQL table:
协会
column | type | example data |
---|---|---|
id | bigint | 1,2,3,... |
part_id | bigint | 1,2,3,... |
car_id | bigint | 1,2,3,... |
truck_id | bigint | 1,2,3,... |
我认为理想情况下,我更喜欢具有数据库 class/subclass 引用的 table。没有考虑太多,像下面这样的东西,虽然它可能需要自己的问题。
column | type | example data |
---|---|---|
id | bigint | 1,2,3,... |
vehicle_id | bigint | 1,2,3,... |
vehicle_type | text | Car or Truck; the field could also be called table_name with cars or trucks being the value |
根据我上面的假设,我测试了关联模型并在关联上将 car/truck 设置为可选,这有效:
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