多对多唯一协会

时间:2017-06-20 23:22:21

标签: ruby-on-rails activerecord ruby-on-rails-5

我在尝试为这个设计问题提出有效的解决方案时遇到了一些麻烦。从本质上讲,该应用程序具有公司模型。每个公司可以“定位”在多个位置(即旧金山,纽约,伦敦等)。同样,每个位置可以有多个与之关联的公司。因此,我的直觉是在公司模型和位置模型之间建立了has_many_belongs_to_many关系。例如:

公司A 旧金山和纽约中有位置。

B公司伦敦,旧金山和慕尼黑设有办事处。

公司C 迈阿密中有位置。

目前,我的ActiveRecord关系设置如下:

class Company < ApplicationRecord
 has_and_belongs_to_many :locations
end

class Location < ApplicationRecord
 has_and_belongs_to_many :companies
end

我正在尝试实现用户可以“向公司添加位置”的功能,如果该位置已经存在,那么它将与该公司相关联。否则,如果该位置尚不存在,则会创建该位置,然后与该公司关联。按照上面的例子:

公司D 已创建。它在迈阿密和休斯顿有位置。由于迈阿密已经在数据库中,因此从迈阿密引用到公司D.但是,由于 Houston 不在表中,因此首先创建,然后在休斯顿公司D 之间建立关系。

我认为这样做的一个好方法是使用某种独特的索引,但这阻止了我两次添加相同的城市(显然)。从本质上讲,有没有办法可以在公司和位置之间建立一种关系,“检查”输入的位置是否已经存在于位置表中,如果是,则进行引用/关联。不确定我是否正在接近正确的'Rails'方式或者使其过于复杂/我是否需要has_many_belongs_to_many关系。任何帮助/指导赞赏!提前致谢!

1 个答案:

答案 0 :(得分:0)

有一种方法可以检查位置是否已经存在,然后创建公司和位置之间的关系,或者如果位置不存在,则首先创建位置,然后使用rails中的find_or_create方法创建关系

在创建公司和位置关系的操作之前,在before_filter中使用此方法 https://apidock.com/rails/v3.2.1/ActiveRecord/Relation/first_or_create