如果关联只能属于其中一个,如何通过模型的 parents 映射关联?

How do I map an association through a model's parents if it can only belong to one of them?

假设我有活动记录 Measurable、Bag 和 ShoppingBag(这基本上是一种特定类型的包):

class Measurable < ActiveRecord::Base

    belongs_to :bag, class_name: Bag
    belongs_to :shopping_bag, class_name: ShoppingBag

end

class Bag  < ActiveRecord::Base

    has_one :shopping_bag, class_name: ShoppingBag

end

class ShoppingBag < ActiveRecord::Base

    belongs_to :bag, class_name: Bag

end

Measurable 只能属于 Bag 或 ShoppingBag。

我如何设置 Measurable 以便在我调用时

measurable.bag

它将直接或通过其 ShoppingBag 到达与其关联的包,而不更改包的关系。

如果您的购物袋是特定的袋子,那么您可以将其声明为子类。

class ShoppingBag < Bag
  // specific attributes
end

如果你不能这样做(正如你在评论中所建议的那样),那么你可以覆盖你可测量的 bag 方法:

def bag
  super || shopping_bag.bag
end

然后可以加个互斥校验(未测试)

validates :bag, absence: true, if: :shopping_bag
validates :shopping_bag, absence: true, if: :bag