Rails транзакция с реляционной зависимостью - PullRequest
1 голос
/ 04 мая 2011

У меня проблемы с транзакциями в Rails 3. В основном у меня есть две модели (Project и Membership)

@project = Project.new(params[:project])
@project.user = current_user

membership = Membership.new
membership.project = @project

Project.transaction do
  begin
    @project.save!
    membership.save!
  rescue
    flash[:notice] = "There was an error creating your project."
  end
end

Я создаю новый проект и пытаюсь немедленно создать членство для проекта (членство на самом деле также имеет отношение к модели пользователя, n: m).

Теперь я запускаю транзакцию, чтобы сохранить проект и членство внутри транзакции. Проблема в том, что я получаю исключение:

Проверка не удалась: проект не может быть пустым

app / controllers / projects_controller.rb: 64: in block in create'<br> app/controllers/projects_controller.rb:61:in create '

Строка 61 - Project.transaction do

1 Ответ

0 голосов
/ 04 мая 2011

ОК, я понял это сам. Модель членства проверяет наличие: project_id. Я устанавливаю членство.проект, прежде чем сохранить проект внутри транзакции. После этого я пытаюсь сохранить членство, но так как проект был задан до того, как он был создан в базе данных, то: project_id равно nil.

Чтобы исправить этот код, мне пришлось изменить его следующим образом:

membership = Membership.new

Project.transaction do
  begin
    @project.save!
    membership.project = @project
    membership.save!
  rescue
    flash[:notice] = "There was an error creating your project."
  end
end

Обратите внимание, что присвоение @project теперь после , проект был сохранен (и автоматически создан идентификатор).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...