after_create_commit不执行某些方法

时间:2018-11-24 11:11:16

标签: ruby-on-rails ruby nginx

所以我在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

在开发和生产环境中进行本地测试时,它可以很好地工作,并且一切都将执行。

但是,当我将其部署到Web服务器(nginx + passenger)时,只会执行create_match_chat的一部分。这样就创建了MatchChat,但是匹配代码并没有通过generate_match_code更改

我尝试阅读,但没有找到任何可能的原因。

我在使用Rails 5.2.1和ruby 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 :(得分:0)

我将从将update_attribute更改为update!开始。您不知道会发生什么,因为update_attribute跳过了验证,因此如果发生验证错误,则不会更新对象,也不会出现异常(documentation

更改代码后,我将在本地使用生产数据库转储来复制问题。

祝你好运。

答案 1 :(得分:0)

您无需在save之后致电update_attribute

我建议您使用update_column来代替,它不会触发回调并且不会更改updated_at字段(由于您只创建了记录,并且可以确定它会持久,因此速度会更快)

您也可以使用activerecord提供的简写create_match_chat(title: ....)

该错误是否取决于home_player或away_player为零?我担心的是send_result_message上发生了某些故障,并且代码的其余部分无法正常工作,但是即使问题出了零,即使家中/家乡都没有,也没有任何意义。尝试对代码的某些行进行注释,直到将其范围缩小到确切的行为止。

答案 2 :(得分:0)

我还怀疑send_welcome_message无效。

在方法内部尝试使用create!而不是create,这样会引发错误,并且您可以了解那里是否有任何错误。

答案 3 :(得分:0)

问题是,nginx / passenger无法正确重新加载更改://重新启动服务器后就发现了