所以我在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"]]
似乎没有使用新查询,但始终是一个非常老的查询。这太奇怪了,我真的需要一些帮助:(
答案 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无法正确重新加载更改://重新启动服务器后就发现了