0

我在我的 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)。

4

2 回答 2

1

你可以使用exists?首先检查是否存在的方法,如下所示:

@person.phone_numbers.build(number: "555-555-1212") unless @person.phone_numbers.exists(number: "555-555-1212")

或者你可以这样做:

PhoneNumber.find_or_create(person_id: @person.id, number: "555-555-1212")
于 2012-04-25T06:55:48.497 回答
0

Rachel the Rails documentation says this:

A has_and_belongs_to_many association creates a direct many-to-many connection with another model, with no intervening model.

What is the difference?

于 2013-08-13T22:31:11.087 回答