ruby-on-rails - 如何在case语句Rails中使用记录ID
问题描述
我在 Rails 中的 before_save 回调中没有成功。
before_save :set_shot_time
after_save :set_status
def set_shot_time
case :id
when 1..24
puts self.shot_time = "9:00 a.m."
when 25..49
puts self.shot_time = "9:15 a.m."
when 50..74
puts self.shot_time = "9:30 a.m."
when 75..99
puts self.shot_time = "9:45 a.m."
when 100..124
...
end
这不会在我的 pg 数据库的 shot_time 行中生成所需的属性。是我的语法吗?我没有收到任何错误,日志也没有显示任何内容。
解决方案
case 语句使用符号:id
而不是方法id
,因此没有任何条件匹配。它在后台使用大小写相等运算符 ( ===
)。例如(1..24) === :id
返回false
since:id
不属于该范围。我建议阅读此答案以更好地了解===
操作员。并且该
set_shot_time
方法应该在after_create
回调中创建记录之后运行,因为id
将nil
在创建记录之前。
您可以删除puts
我猜您为调试添加的调用。
after_create :set_shot_time
def set_shot_time
return if shot_time
case id
when 1..24
self.shot_time = "9:00 a.m."
when 25..49
self.shot_time = "9:15 a.m."
when 50..74
self.shot_time = "9:30 a.m."
when 75..99
self.shot_time = "9:45 a.m."
# ...
end
save!
end
请注意,如果save!
最后没有方法调用,则不会更新记录。
我不确定我是否理解逻辑,但您也可以将其写为
def set_shot_time
return if shot_time
self.shot_time = case id
when 1..24
"9:00 a.m."
when 25..49
"9:15 a.m."
when 50..74
"9:30 a.m."
when 75..99
"9:45 a.m."
# ...
end
save!
end
推荐阅读
- java - 如何使用 Eclipse 制作 Android 应用程序
- javascript - 在 R 中单击传单中的按钮时显示摘要统计信息
- python - python-binance:获取所有订单,不指定符号
- salesforce - 即使案例停止,如何处理里程碑计时器仍在闪电运行?在销售人员中
- java - “无法连接到 Browsermob-Proxy 出现代理错误。” 在Linux中
- php - 如何在codeigniter中获取Ajax成功函数数据
- angular - 如何在打字稿/角度程序上使用 hubspot Conversations sdk?
- javascript - 要求使 div 可拖动而不是放在屏幕外
- go - 使用 ssh golang 包解析 ssh 密钥
- error-handling - 最后会在 XMPP 中类比吗?