我在我的 Rails 项目中遇到了几个多对多关系的问题。可以用一个例子来说明:
假设我有模型Person
,并且PhoneNumber
加入了PersonPhoneNumber
。这种关系是多对多的,因为人们可以拥有多个电话号码,并且可以通过同一个电话号码联系到多个人(在帮助台等情况下)。
class Person < ActiveRecord::Base
has_many :person_phone_numbers
has_many :phone_numbers, :through => :person_phone_numbers
end
class PhoneNumber < ActiveRecord::Base
has_many :person_phone_numbers
has_many :people, :through => :person_phone_numbers
validates :number, :uniqueness => true
end
class PersonPhoneNumber < ActiveRecord::Base
belongs_to :person
belongs_to :phone_number
end
我有一个人员表单,可让我创建/更新人们的联系信息。我用它把号码分配555-555-1212
给鲍勃。如果PhoneNumber
不存在具有该编号的对象,我希望创建它(如标准accepts_nested_attributes_for
行为)。但如果它确实存在,我只想创建一个PersonPhoneNumber
对象来将 Bob 与它关联起来PhoneNumber
。
我怎样才能最优雅地做到这一点?我尝试放入一个before_validation
钩子PersonPhoneNumber
来查找匹配PhoneNumber
和设置phone_number_id
,但这导致了非常奇怪的行为(包括使我的 Rails 服务器因消息而崩溃Illegal instruction: 4
)。