2016-04-20 3 views
0

Скажем, у нас есть модели Patient и PatientRawData (с ассоциацией принадлежность к пациенту).Rails создает связанные модели без сохранения?

Возможно ли создать новые записи (без сохранения их в базе данных), связать их и, наконец, сохранить их в базе данных?

Что-то вроде этого:

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

Поэтому я хочу, чтобы это сделать, то, что в моем реальном сценарии случае может более сложные модели/ассоциации, и я предпочел бы не иметь частичные вещи в базе данных в случай исключения.

По этой причине я предпочитаю строить любую сложную вещь, которую я хочу, и в качестве последнего шага для хранения всего объекта в базе данных.

ответ

0

Вы можете использовать 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

Да, Rails позволяет нам это сделать:

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

рельсов из опоры коробки для данного типа вопросов с использованием вложенных атрибутов. 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]) 
Смежные вопросы