Rails创建相关模型而不保存?

时间:2016-04-20 14:40:00

标签: ruby-on-rails database in-memory

假设我们有模型Patient和PatientRawData(与患者的belongs_to关联)。

是否可以创建新记录(不将其保存在数据库中),关联它们,最后将它们保存在数据库中?

这样的事情:

patient = Patient.new(:name => 'John', :age => 34)
rawtext = PatientRawText.new(:rawtext => 'My name is..')
patient.rawtext = rawtext
patient.save!

我想这样做的原因是,在我的实际案例中,可能会有更复杂的模型/关联,如果出现异常,我宁愿在数据库中没有部分内容。

出于这个原因,我更喜欢构建我想要的任何复杂的东西,并作为将整个事物存储在数据库中的最后一步。

4 个答案:

答案 0 :(得分:1)

您可以使用transaction来阻止创建一堆记录。如果块中的任何位置发生异常,它将回滚所有ActiveRecord保存。

ActiveRecord::base.transaction do
  patient = Patient.new(:name => 'John', :age => 34)
  rawtext = PatientRawText.create!(:rawtext => 'My name is..')
  patient.rawtext = rawtext
  patient.save! # <- if this fails
  raise "I don't want to be here"  # <- or if you manually raise an exeption 
end

如果引发异常,即使在成功创建PatientRawText对象之后(比如patient.save!失败),也会回滚PatientRawText创建。

答案 1 :(得分:1)

Rails使用嵌套属性对此类问题提供开箱即用的支持。 http://api.rubyonrails.org/classes/ActiveRecord/NestedAttributes/ClassMethods.html

class Patient < ActiveRecord::Base
  has_one :patient_raw_text
  accepts_nested_attributes_for :patient_raw_text
end

params = { patient: { name: 'Jack', patient_raw_text_attributes: { rawtext: '...' } }}
member = Patient .create(params[:patient])

答案 2 :(得分:0)

是的,Rails允许我们这样做:

patient = Patient.new(:name => 'John', :age => 34)
patient.build_patient_raw_text(:rawtext => 'My name is..')
patient.save!

答案 3 :(得分:0)

在实例的引用上使用new将创建一个未保存的关联模型,该模型的外键将在保存父对象时自动分配。换句话说...

patient = Patient.new(:name => 'John', :age => 34)
patient.patient_raw_text.new(:rawtext => 'My name is..')
patient.save!

与您建议的相同...只是保存一行和局部变量赋值