rails model 中使用 enum
2017/01/07
在数据库里,有时我们会使用 integer 表示不同状态,例如 status 字段,1表示正常,2表示不正常。
但是这种数字多起来之后,就会很难管理。
rails model 中的 enum 就是用来处理这种问题的。
# product.rb
class Product < ApplicationRecord
enum status: { valid: 1, invalid: 2 }
end
我们可以得到如下几种方法:
product.valid! # 设置 product status 为 valid
product.valid? # 检查 product status 是否为 valid
product.status # 输出当前 status 对应的字面量 "valid" / "invalid"
product.status = "valid" # 修改 status 为 1
Product.statuses # 输出 {"valid" => 1, "invalid" => 2}
Product.valid # 查询 products 表中 status = 1 的数据
在使用 enum 查询的时候,rails 不同版本会有不同的结果。
rails 5 的结果如下
Product.where(status: "valid") # 可以直接使用字面量作为查询条件
rails 4.2 的结果如下
Product.where(status: "valid") # 查询条件始终是 status = 0
# 需要改成下面的形式
Product.where(status: Product.statuses[:valid])
# 或者还是写原始数值
Product.where(status: 1)