Rails在同一个模型中关联“has_many:through”

时间:2015-01-02 20:32:49

标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-4

我有两种模式:公司和商业。 该业务属于两家公司(供应商和客户)。所以我写道:

商业模式:

class Business < ActiveRecord::Base
  belongs_to :client, :class_name => 'Company'
  belongs_to :supplier, :class_name => 'Company'
end

公司型号:

class Company < ActiveRecord::Base
  has_many :businesses
  has_many :companies, through: :businesses
end

但我无法通过他的公司来@ company.companies访问与公司相关的公司。我怎么能这样做?

1 个答案:

答案 0 :(得分:1)

您可以拥有一个额外的表BusinessRelationship,它具有&#34; relationship_type&#34;等属性。这将是&#34;客户&#34;或&#34; supplier&#34;,或者实际上是对另一个RelationshipTypes表的引用。但是,这会将大量表格添加到简单的数据模型中,所以从一开始你可能只想让事情变得简单:

在公司

has_many :businesses_as_client, class_name: "Business", inverse_of: :client, foreign_key: :client_id, dependent: :destroy
has_many :businesses_as_supplier, class_name: "Business", inverse_of: :supplier, foreign_key: :supplier_id, dependent: :destroy

在商业中

def companies
  (self.businesses_as_client + self.businesses_as_supplier).collect(&:company)
end

这可能效率不高,所以你可以这样做:

def companies
  Company.where(:id => (self.businesses_as_client.collect(&:supplier_id) + self.businesses_as_supplier.collect(&:client_id)))
end

或者某种顺序。对此进行扩展,您甚至可以在公司中尝试:

has_many :companies_as_client, through: :businesses_as_client
has_many :companies_as_supplier, through: businesses_as_supplier

def companies
  companies_as_client + companies_as_supplier
end 

这可能是一个很长的镜头!