首页 > 解决方案 > 如何在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 行中生成所需的属性。是我的语法吗?我没有收到任何错误,日志也没有显示任何内容。

标签: ruby-on-rails

解决方案


case 语句使用符号:id而不是方法id,因此没有任何条件匹配。它在后台使用大小写相等运算符 ( ===)。例如(1..24) === :id返回falsesince:id不属于该范围。我建议阅读答案以更好地了解===操作员。并且该 set_shot_time方法应该在after_create回调中创建记录之后运行,因为idnil在创建记录之前。

您可以删除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

推荐阅读