Обратные вызовы активных записей, выполняемые до создания связанных записей в методах создания и обновления - PullRequest
1 голос
/ 08 ноября 2019

В моем обновлении и методе создания для моего игрового контроллера я создаю некоторые game_events. Затем на моей игровой модели должны выполняться обратные вызовы after_save. Эти обратные вызовы генерируют данные, которые мне нужны, и сохраняются в соответствующих столбцах. Однако проблема, с которой я столкнулся, заключается в том, что game_events создаются, кажется, после вызова обратных вызовов. Так что мой обратный вызов set_events_user, похоже, не подтверждает наличие каких-либо game_events. Однако, если из консоли я сохраняю игру во второй раз, обратные вызовы подтверждают эти game_events, и данные events_user генерируются нормально.

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

def create
    @game = Game.create(game_params)
    authorize @game
    @game.organization_id = current_user.organization_id
    params[:events_user].each do |e|
      @game.game_events.create({
        event_type: e["event_type"],
        event_id: e["event_id"],
      })
    end
    @game.save
    render json: @game, status: :ok
  rescue StandardError => e
    render json: @game.errors, status: :unprocessable_entity
  end

  def update
    authorize @game
    @game.game_events.destroy_all
    params[:events_user].each do |e|
      @game.game_events.create({
        event_type: e["event_type"],
        event_id: e["event_id"],
      })
    end
    @game.update(game_params)
    render json: @game, status: :ok
  rescue StandardError => e
    render json: @game.errors, status: :unprocessable_entity
  end


after_save :set_events_user


def set_events_user
        @sequence = []
        self.game_events.by_sequence.each do |e|
            @e = {}
            @e[:id] = e.id
            @e[:event_id] = e.event_id
            @e[:event_type] = e.event_type
            @e[:question_text] = e.event.question_text
            @e[:a1] = {es: e.event.a1, en: e.event.a1 }
            @e[:a2] = {es: e.event.a2, en: e.event.a2 }
            @e[:a3] = {es: e.event.a3, en: e.event.a3 }
            @e[:correct_answer] = e.event.correct_answer if e.event_type == 'Question'
            @sequence << @e
        end

        @sequence.to_json
        self.events_user = @sequence
    end

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

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