ActiveRecord RoR - 仅保存新的关联对象

时间:2011-10-12 20:49:03

标签: ruby-on-rails activerecord

如何在不保存(更新)基础对象的情况下仅保存(插入)关联对象?

例如我只想保存电话号码,我不想重新保存/更新人物对象。

def create_numbers
  #params =>   person_id => 41, person => {:phone_number => '12343445, 1234566, 234886'}
  @person = params[:person_id]
  nums = params[:person][:phone_numbers].split(',')
  nums.each do |num|
    @person.phone_numbers.build(:number => num)
  end
  @person.save    #here I just want to save the numbers, I don't want to save the person.  It has read only attributes
end

型号:

Person < ...
  # id, name
  belongs_to :school, :class_name => :facility
  has_many :phone_numbers
end

PhoneNumber < ...
  # id, number
  belongs_to :person   
end

这是一个愚蠢的例子,但它说明了我正在努力实现的目标

2 个答案:

答案 0 :(得分:2)

@person.phone_numbers.create(:number => num)

怎么样?

缺点是你不知道它是否失败 - 你可以处理它,但这取决于你想要处理它的确切程度。

答案 1 :(得分:1)

最简单的方法是将build(:number => num)替换为create(:number => num),这将立即构建并保存phone_number对象(假设它通过了验证)。

如果您需要在创建整个集合后保存所有内容(由于某种原因),您可以执行类似

的操作
@person.phone_numbers.each{|num| num.save}