我有以下模型:Organisation
,Valuation
和Capability
。
Organisation
模型曾经有一个国家/地区字段,但我注意到它可以有多个位置。
要解决此问题,我可以创建Location
模型,并在has_many
和Organisation
之间添加Location
关系,但同样地,某个位置可以属于多个组织。例如,组织X可能在英国,德国和美国有一个位置,组织Y可能在英国和德国有一个位置。
更大的问题在于Valuation
,它描述了针对特定功能的组织 在特定位置 的估值。因此,在位置Y的组织X的估值可能是10,对于位置Z的组织X,它可能是8。
现在Valuation
与belongs_to
和Organisation
都有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
答案 0 :(得分:0)
Organization
和Location
之间的关系实际上是多对多的。您需要的是一个联合表格OrganizationsLocation
,其表格为organizations_locations
,其中包含架构organization_id
和location_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)