假设我们有模型Patient和PatientRawData(与患者的belongs_to关联)。
是否可以创建新记录(不将其保存在数据库中),关联它们,最后将它们保存在数据库中?
这样的事情:
patient = Patient.new(:name => 'John', :age => 34)
rawtext = PatientRawText.new(:rawtext => 'My name is..')
patient.rawtext = rawtext
patient.save!
我想这样做的原因是,在我的实际案例中,可能会有更复杂的模型/关联,如果出现异常,我宁愿在数据库中没有部分内容。
出于这个原因,我更喜欢构建我想要的任何复杂的东西,并作为将整个事物存储在数据库中的最后一步。
答案 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!
与您建议的相同...只是保存一行和局部变量赋值