gpt4 book ai didi

ruby-on-rails - Rails 多态 has_many

转载 作者:行者123 更新时间:2023-12-03 23:53:52 25 4
gpt4 key购买 nike

使用 Ruby on Rails,如何实现多态 has_many 关系,其中所有者始终是已知的,但关联中的项将是某种多态(但同质)类型,由所有者中的列指定?例如,假设 Producerhas_many 产品但生产者实例实际上可能有许多自行车、冰棒或鞋带。我可以很容易地让每个产品类(自行车、冰棒等)与生产者有 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, ...]

对不起,如果这是明显的或常见的重复;我在轻松实现它时遇到了令人惊讶的困难。

最佳答案

您必须在生产商而不是产品上使用 STI。这样你对每种类型的生产者都有不同的行为,但在一个 producers 中。 table 。

(几乎)根本没有多态性!

class Product < ActiveRecord::Base
# does not have a 'type' column, so there is no STI here,
# it is like an abstract superclass.
belongs_to :producer
end

class Bicycle < Product
end

class Popsicle < Product
end

class Producer < ActiveRecord::Base
# it has a 'type' column so we have STI here!!
end

class BicycleProducer < Producer
has_many :products, :class_name => "Bicycle", :inverse_of => :producer
end

class PopsicleProducer < Producer
has_many :products, :class_name => "Popsicle", :inverse_of => :producer
end

关于ruby-on-rails - Rails 多态 has_many,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3209322/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com