我有两个模型Person
和Address
以及一个包含(person_id,address_id)的连接表Persons::Address
。如果我的Person对象是p,那么我会p.address_ids
获取该人的地址ID数组。
现在,我有一个使用after_save
的{{1}}回调。我们说我有p.address_ids = [a,b,c]。在此之后我运行了这两个语句。
p.address_ids
在after_save回调中,如果我a.address_ids = [a,b,d]
a.save
,我会得到[a,b,d]。我想创建一个数组A = [a,b,c,d],它应该包含(最后一个数组+当前数组).uniq的元素,我该怎么办?
self.address_ids
简单来说,我想要像{p.address_ids'这样的关联Update :
(ActiveModel :: Dirty)。
答案 0 :(得分:0)
这是一种多对多的关系,我认为你做错了。
应该将联接表称为addresses_people
,您可以使用此迁移来生成它:
class CreateJoinTableAddressPerson < ActiveRecord::Migration
def change
create_join_table :addresses, :people
add_index :addresses_people, [:address_id, :person_id], unique: true
end
end
我在复合键上放了一个唯一索引,以防止多次输入相同的关系。
确保您的Person
班级有has_and_belongs_to_many :addresses
且您的Address
班级有has_and_belongs_to_many :people
假设您有一个Person
对象p
,此人有两个地址a
和b
您可以获取p
地址的集合通过说p.addresses
,您可以通过a
a.people
的人员集合
如果您想向p
p.addresses << c
p.addresses << d
如果您添加的地址已经与p
相关联,则不会重复,也不会发生任何变化。
答案 1 :(得分:0)
试试这个:
a.address_ids = a.address_ids | [a,b,d]
答案 2 :(得分:0)
如果在before_save回调中存储旧的address_id,然后将其与新的一起用于创建连接数组,该怎么办?