2014-04-23 3 views
0

У меня есть 2 родственных модели, и мне нужно их проверить и создать.Проверка и сохранение связанных моделей вместе

Применение

class Application < ActiveRecord::Base 
    has_many :application_sessions, inverse_of: :application 

ApplicationsSession

class ApplicationSession < ActiveRecord::Base 
    belongs_to :application, inverse_of: :application_sessions 


  1. Если бы это было возможно, я бы лик e, чтобы создать Application через ApplicationSession, но application_session.build_application не будет работать, потому что он никогда не будет действительной записью.

  2. application_session.create_application не работает, потому что даже если ApplicationSession не является допустимой записью, он создаст Application.

Для первого; он проверяет Application и ApplicationSession. Эта логика может работать нормально, если я только пропустил проверку application_id для ApplicationSession, если Application является действительной записью. Тем не менее, я предпочитаю использовать более элегантное решение, если оно есть.

Для второго; Я могу удалить Application, если ApplicationSession не является допустимой записью, но мне это не совсем понравилось.


Что лучше всего подходит для создания/не создания зависимых записей вместе с Rails?



Разъяснение:

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

ответ

1

Я думаю, что использование новых и сборка будет работать.

application = Application.new({attr1: val1, attr2: val2 ..}) 
application.application_sessions.build({attr1: val1, attr2: val2 ..}) 
application.save 

Таким образом, если приложение является недействительным, приложение и его новый application_session не будет сохранен. То же самое происходит, если application_session недействителен.

В терминале, где вы зажжены вашу команду rails console, вы увидите что-то вроде:

(0.1ms) begin transaction 
(0.1ms) rollback transaction 

Если приложение и его новый application_session являются действительными, как будет сохранен :)

0

С точки зрения моделирования данных Я не уверен, что вы пытаетесь сделать.

Я думаю, что у вас есть отношения родительский/дочерний, где родительский является необязательным?

Если вы создадите родителя, а затем удалите его, у вас будут свисающие ключи в дочернем элементе, которые ничего не указывают, гораздо лучше иметь нулевые значения.

Есть ли причина, по которой вы не можете просто позвонить new или создать с нулевым родительским идентификатором? Обязателен ли родительский ключ? Если это отключит обязательное требование, оно должно работать. Построение только работает от родителя к дочернему, а не наоборот, когда все ключи имеют нулевое значение. Я думаю, вам нужно вызвать save на родительском, а дети сохраняются, как только родительский идентификатор известен.

Если родитель должен существовать для вашего приложения для работы, создайте фиктивный код и у вас есть все дети, которых вы не хотите иметь определенного родителя, принадлежащего ему, тогда вы можете легко найти их снова.Не зная потока вашего приложения, я не уверен, что еще я мог бы посоветовать.

+0

Существование родителя является обязательным. Дело в том; родитель должен существовать только в том случае, если первый созданный ребенок действителен. Поэтому мне нужно проверить дочерние элементы до создания родителя; если это возможно. Но вы не можете этого сделать, потому что ребенок всегда будет недопустимой, если только нет родителя. –

+0

В этом случае ... используйте транзакцию :) Откажитесь от нее, если ребенок недействителен. – Ghoti

+0

Сделки работали, но, вероятно, это не лучшее решение для подобных проблем. Кроме того, контроллеры стали сложными. Я реализую первое решение, и тесты говорят, что они делают все отлично, а коды более читабельны. Тем не менее, я был бы счастливее, если бы было более простое и не-хакерское решение. –

Смежные вопросы