如果关联只能属于其中一个,如何通过模型的 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
假设我有活动记录 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