Rails:链接两个继承相同模型的模型

时间:2012-10-03 14:46:29

标签: ruby-on-rails many-to-many single-table-inheritance

这有点棘手,所以如果您需要更多信息,请不要犹豫!

我有两个模型,StoreConsumer通过两种方式链接:

1 / StoreConsumer继承自同一型号Profile,因为它们共享许多属性(名称,位置,电子邮件,网页等)。这是Rails AR代码:

class Profile << ActiveRecord::Base
    # Attributes and validation rules go here.
end

class Store << Profile
end

class Consumer << Profile
end

这是众所周知的单表继承(STI)。

2 /除了STI之外,StoreConsumer由多对多关系链接:

  • 商店有很多客户(很多消费者)

  • 消费者是许多商店的客户

因为我需要更多的链接属性(Store - Consumer),我必须创建一个额外的模型来链接它们:Client

以下是我的最终AR模型:

class Profile << ActiveRecord::Base
    # Attributes and validation rules go here.
end

class Store << Profile
    has_many :clients
end

class Consumer << Profile
    has_many :clients
end

class Client << ActiveRecord::Base
    belongs_to :store
    belongs_to :consumer
end

问题

使用STI不会创建store_id和consumer_id ......我们只有profile_id(因为一个真实的表Profile)。那么,我如何定位具有store_id和client_id的正确Client行?

知道怎么做吗?提前谢谢。

1 个答案:

答案 0 :(得分:3)

我认为你想做的就是这样。另外,我同意Daniel Wright的评论。

class Profile << ActiveRecord::Base
    belongs_to :store
    belongs_to :consumer
end

class Store << ActiveRecord::Base
    has_one :profile
    has_many :clients
    has_many :consumers, :through => :clients
end

class Consumer << ActiveRecord::Base
    has_one :profile
    has_many :clients
    has_many :stores, :through => :clients
end

class Client << ActiveRecord::Base
    belongs_to :store
    belongs_to :consumer
end

但是如果你想让它与你拥有的东西一起工作,你可以做类似的事情:

class Profile << ActiveRecord::Base

end

class Store << Profile
    has_many :clients, :foreign_key => 'store_id'
    has_many :consumers, :through => :clients
end

class Consumer << Profile
    has_many :clients, :foreign_key => 'consumer_id'
    has_many :stores, :through => :clients
end

class Client << ActiveRecord::Base
    belongs_to :store
    belongs_to :consumer
end