Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rails多对多关系和嵌套表单:如果对象已存在,则与该对象关联_Ruby On Rails_Ruby On Rails 3_Activerecord - Fatal编程技术网

Ruby on rails Rails多对多关系和嵌套表单:如果对象已存在,则与该对象关联

Ruby on rails Rails多对多关系和嵌套表单:如果对象已存在,则与该对象关联,ruby-on-rails,ruby-on-rails-3,activerecord,Ruby On Rails,Ruby On Rails 3,Activerecord,我在Rails项目中遇到了几个多对多关系的问题。可以用一个例子来说明: 假设我有型号Person和PhoneNumber,后面是PersonPhoneNumber。这种关系是多对多的,因为人们可以有多个电话号码,并且可以通过同一个电话号码联系到多个人(例如,在帮助台的情况下) class-Person:个人电话号码 结束 类PhoneNumber:person\u电话号码 验证:number,:university=>true 结束 类PersonPhoneNumber

我在Rails项目中遇到了几个多对多关系的问题。可以用一个例子来说明:

假设我有型号
Person
PhoneNumber
,后面是
PersonPhoneNumber
。这种关系是多对多的,因为人们可以有多个电话号码,并且可以通过同一个电话号码联系到多个人(例如,在帮助台的情况下)

class-Person:个人电话号码
结束
类PhoneNumber:person\u电话号码
验证:number,:university=>true
结束
类PersonPhoneNumber
我有个人表单,可以创建/更新人们的联系信息。我使用它将编号
555-555-1212
分配给Bob。如果带有该号码的
PhoneNumber
对象不存在,我希望创建它(如标准
接受
行为的\u嵌套的\u属性\u)。但如果它确实存在,我只想创建一个
PersonPhoneNumber
对象,将Bob与该
PhoneNumber
关联


我怎样才能最优雅地完成这个任务?我试着在验证之前加入一个
,钩住
PersonPhoneNumber
,寻找一个匹配的
PhoneNumber
,并设置
PhoneNumber\u id
,但这导致了非常奇怪的行为(包括让我的Rails服务器崩溃,消息是
非法指令:4
)。

你可以使用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")
或者你可以这样做:

@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")

Rails文档中说:

A has_和_beside_to_许多关联创建了与另一个模型的直接多对多连接,没有中间模型


区别是什么?

这是一个多对多关系,而不是一个
有多/属于
的关系。