after_create_commit не выполняет некоторые методы - PullRequest
0 голосов
/ 24 ноября 2018

Итак, у меня есть класс модели ruby ​​on rails:

class Match < ApplicationRecord
  belongs_to :home_player, class_name: "User", foreign_key: "home_player_user_id", optional: true
  belongs_to :away_player, class_name: "User", foreign_key: "away_player_user_id", optional: true
  belongs_to :winner, class_name: "User", foreign_key: "winner_user_id", optional: true
  belongs_to :round

  has_one :match_chat

  after_create_commit :create_match_chat

  def create_match_chat
    MatchChat.create(
        title: "Chat##{id} #{home_player.try(:userName).presence || 'Free Win'} vs. #{away_player.try(:userName).presence || 'Free Win'}",
        match_id: id
    )

    if home_player == nil
      send_result_message("We detected a free win. Setting free win user result to LOST")
      update_attribute(:home_score, -2)
      save
    end

    if away_player == nil
      send_result_message("We detected a free win. Setting free win user result to LOST")
      update_attribute(:away_score, -2)
      save
    end

    generate_match_code

    send_welcome_message("Welcome to your game. Please enter the code 
       above in order to get matched up and play your game. For 
       coordination please use the Chat below.")
  end


  def generate_match_code
    update_attribute(:first_pokemon, rand(10) + 1)
    update_attribute(:second_pokemon, rand(10) + 1)
    update_attribute(:third_pokemon, rand(10) + 1)
  end

  def send_welcome_message(message)
    Message.create(body: "SYSTEM: #{message}", user_id: 1, match_chat:
        match_chat)
  end

  def send_result_message(message)
    Message.create(body: "FREE WIN: #{message}", user_id: 1, match_chat:
        match_chat)
  end
end

При локальном тестировании в среде разработки и производства он работает совершенно нормально, и все выполняется.

Однако, когда яразвернуть это на веб-сервере (nginx + passenger), только части create_match_chat выполняются.Таким образом, MatchChat создается, но код соответствия не изменяется с помощью generate_match_code

Я пытался прочитать, но ничего не нашел, почему это может происходить.

Я использую рельсы 5.2.1 с рубином 2.5.1

Есть какие-нибудь подсказки?

ОБНОВЛЕНИЕ

match = Match.new
match.home_player_user_id = home
match.away_player_user_id = away
match.round_id = id
match.first_pokemon = first_pokemon
match.second_pokemon = second_pokemon
match.third_pokemon = third_pokemon
match.save!

Даже делать это самым ручным способом непохоже, что-то влияет ..

D, [2018-11-25T09:45:03.240848 #4994] DEBUG -- : Match Create (0.3ms) INSERT INTO "matches" ("away_player_user_id", "round_id", "created_at", "updated_at") VALUES (?, ?, ?, ?) [["away_player_user_id", 1], ["round_id", 20], ["created_at", "2018-11-25 08:45:03.239943"], ["updated_at", "2018-11-25 08:45:03.239943"]]

Похоже, что он не использует новые запросы, но всегда очень старый.Это супер странно, и мне очень нужна помощь с этим: (

Ответы [ 4 ]

0 голосов
/ 29 ноября 2018

Проблема заключалась в том, что nginx / passenger не перезагружал изменения правильно: / выяснил это после перезагрузки сервера

0 голосов
/ 24 ноября 2018

Вам не нужно звонить save после update_attribute.

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

Вы также можете использовать сокращение create_match_chat(title: ....), предоставленное activerecord.

Зависит ли ошибка от home_player илипрочь или нет ноль?Я подозреваю, что что-то не работает на send_result_message, а остальная часть кода не работает, но это не имеет смысла, если проблема возникает, даже если дома / на выезде не ноль.Попробуйте комментировать некоторые строки кода, пока не сможете сузить их до точной строки.

0 голосов
/ 26 ноября 2018

Я также подозреваю, что send_welcome_message не работает.

Внутри метода попробуйте create! вместо create, чтобы выдать ошибку, и вы сможете понять, если что-то пошло не так.

0 голосов
/ 24 ноября 2018

Я бы начал с изменения update_attribute на update!.Вы не знаете, что происходит, потому что update_attribute пропускает проверку, поэтому в случае ошибки проверки объект не обновляется, и вы не получаете исключение ( документация )

Послеизменяя код, я бы использовал локальный дамп БД для репликации проблемы.

Удачи.

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