Rails has_many:through:与使用STI的表关联

时间:2014-04-11 04:19:03

标签: ruby-on-rails activerecord associations has-many single-table-inheritance

我无法弄清楚如何使这项工作;我查看了其他SO问题,包括this onethis one,但无济于事。

以下是我的模特:

class User < ActiveRecord::Base
  has_many :connections
  has_many :data_sources, through: :connections
end

class Connection < ActiveRecord::Base
  belongs_to :user
  belongs_to :data_source
end

class DataSource < ActiveRecord::Base
  has_many :connections
  has_many :users, through: :connections
end

class AdNetwork < DataSource
end

class Marketplace < DataSource
end

AdNetwork,Marketplace和DataSource都通过STI使用相同的表格。

我想在名为Usermarketplaces的{​​{1}}上设置关联,返回ad_networks data_sources typeMarketPlace的所有AdNetwork分别为{1}}。我怎么能这样做?


我尝试过的不起作用的事情:

class User
  has_many :marketplaces, through: :data_sources # Throws an error
  has_many :marketplaces, through: :connections # Throws an error
  has_many :marketplaces, through: :connections, source: :data_source # Returns ALL data sources, not just Marketplaces
  has_many :marketplaces, { through: :connections, source: :data_source }, -> { where(type: "Marketplace" } # Again this returns ALL data sources. Wtf???
end

我还尝试将data_source_type列添加到Connection并添加以下行

类连接   belongs_to:data_source,polymorphic:true

类DataSource   has_many:connections,as :: data_source 端

类用户   has_many:marketplaces,through :: connections,source :: data_source,source_type:&#34; Marketplace&#34; 端

...但现在#marketplaces返回一个空关系。 (看起来data_source_type始终设置为DataSource,即使我添加市场或AdNetwork也是如此。)

我做错了什么?

1 个答案:

答案 0 :(得分:0)

我正在做类似的事情。我认为答案在于你的模型属性。

当我意识到我在连接表上遗漏了引用ID(类似于你的连接表)时,我解决了这个问题。

参见参考:http://guides.rubyonrails.org/association_basics.html#the-has-one-through-association

您找到了解决方案吗?