Rails通过连接表进行多对多关联

时间:2016-06-22 12:58:09

标签: ruby-on-rails

我有以下模型:OrganisationValuationCapability

Organisation模型曾经有一个国家/地区字段,但我注意到它可以有多个位置。

要解决此问题,我可以创建Location模型,并在has_manyOrganisation之间添加Location关系,但同样地,某个位置可以属于多个组织。例如,组织X可能在英国,德国和美国有一个位置,组织Y可能在英国和德国有一个位置。

更大的问题在于Valuation,它描述了针对特定功能的组织 在特定位置 的估值。因此,在位置Y的组织X的估值可能是10,对于位置Z的组织X,它可能是8。

现在Valuationbelongs_toOrganisation都有Capability个关联:

class Valuation < ApplicationRecord
  belongs_to :organisation
  belongs_to :capability
end

考虑到位置,我需要添加另一个关联,但我正在寻找一些提示。

接下来的问题是,如何设置我的关联,以便我可以提出如下问题:

组织x在所有地点的能力为y的平均估值

位置z的能力y的组织x的估值是什么

修改

结束了many-to-many方法,结束了模型:

class Organisation < ApplicationRecord
  has_many :memberships
  has_many :locations, through: :memberships
end

class Location < ApplicationRecord    
  has_many :memberships
  has_many :organisations, through: :memberships
end

class Membership < ApplicationRecord
  belongs_to :organisation
  belongs_to :location
end

现在问题是将其与Valuation

相关联

1 个答案:

答案 0 :(得分:0)

OrganizationLocation之间的关系实际上是多对多的。您需要的是一个联合表格OrganizationsLocation,其表格为organizations_locations,其中包含架构organization_idlocation_id

而且,估值实际上应属于OrganizationsLocation记录。

class OrganizationsLocation < ActiveRecord::Base
  belongs_to :organization
  belongs_to :location

  has_many :valuations
end

组织可以通过以上模型进行多次估值。

class Organization < ActiveRecord::Base
  has_many :organizations_locations
  has_many :valuations, through: :organizations_locations
end

对于您的第一个问题“组织x的平均估值是多少,所有地点的能力为y”,您可以使用以下代码获得所有估值并计算平均值:

x.valuations.where(capability_id: y.id)

对于您的第二个问题:“位置z处的能力y的组织x的估值是什么”:

OrganizationsLocation.find_by(organization_id: x.id, location_id: z.id).valuations.find_by(capability_id: y.id)

更新:

由于您已经有一个联合表memberships,这与我建议的表organizations_locations相同,因此它可以满足您的需求。

Valuation belongs_to Membership代替Organization

class Valuation < ActiveRecord::Base
  belongs_to :membership
  belongs_to :capability
end

x.valuations.where(capability_id: y.id)

Membership.find_by(organization_id: x.id, location_id: z.id).valuations.find_by(capability_id: y.id)