Ruby on rails 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
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_许多关联创建了与另一个模型的直接多对多连接,没有中间模型
区别是什么?这是一个多对多关系,而不是一个有多/属于的关系。