【发布时间】:2011-03-13 15:59:10
【问题描述】:
使用 Ruby on Rails,如何实现多态 has_many 关系,其中所有者始终是已知的,但关联中的项目将是某种多态(但同质)类型,由所有者中的列指定?例如,假设Producer 类has_many 产品,但生产者实例实际上可能有许多自行车、冰棒或鞋带。我可以轻松地让每个产品类(自行车、冰棒等)与 Producer 有belongs_to 关系,但是给定生产者实例,如果产品类型不同(每个生产者实例),我如何获取产品集合?
Rails 多态关联允许生产者属于许多产品,但我需要相反的关系。例如:
class Bicycle < ActiveRecord::Base
belongs_to :producer
end
class Popsicle < ActiveRecord::Base
belongs_to :producer
end
class Producer < ActiveRecord::Base
has_many :products, :polymorphic_column => :type # last part is made-up...
end
所以我的 Producer 表已经有一个“类型”列,它对应于某些产品类别(例如自行车、冰棒等),但我怎样才能让 Rails 让我做类似的事情:
>> bike_producer.products
#=> [Bicycle@123, Bicycle@456, ...]
>> popsicle_producer.products
#=> [Popsicle@321, Popsicle@654, ...]
对不起,如果这是明显的或常见的重复;我很难轻松实现它。
【问题讨论】:
-
作为一个注释,我强烈建议不要使用 Factory 作为模型名称,因为 factory_girl 是一个非常常用的扩展,用于生成模型而不是固定装置,这可能会让阅读你的人感到非常困惑代码。
-
@jamie - 感谢您的提示,我已将术语切换为“生产者”,希望不会与任何并发库混淆 =)
-
没问题。另外,我还没有找到一个好的解决方案。据我所知,Rails 中尚不存在对象具有多态子对象的能力。不过,您可能想查看blog.hasmanythrough.com/2006/4/3/polymorphic-through 以供参考。
-
是的,请阅读那篇文章。我已经破解了一个简单的实例方法,它使用列值到类名的映射并执行 find_by_producer_id,它工作正常,但我没有得到任何关联便利方法。我认为这肯定是一个已解决的问题,但也许不是......
-
与从基本产品模型继承所有不同产品相比,使用多态关系有什么优势?单表继承似乎可以解决您的许多问题。
标签: ruby-on-rails associations polymorphic-associations