在Rails中的After_save

时间:2015-08-20 20:00:15

标签: ruby-on-rails ruby-on-rails-3 ruby-on-rails-4 callback

我有两个模型PersonAddress以及一个包含(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)。

3 个答案:

答案 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,此人有两个地址ab您可以获取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,然后将其与新的一起用于创建连接数组,该怎么办?