从ActiveRecord的枚举documentation看,我发现不一致的是,有时候我被允许使用符号,有时我只需要使用字符串。
从文档中,您可以使用符号查询:
Conversation.where(status: [:active, :archived])
Conversation.where.not(status: :active)
但是您不能使用符号进行比较:
conversation = Conversation.new(status: :active)
conversation.status # "active"
conversation.status == :active # false
您可以使用符号设置状态,但是读回它会返回一个字符串,因此您必须始终使用字符串进行比较:
conversation.status = :active # :active
conversation.status # "active"
我的意思是:我希望只使用符号,因为性能很好,而且对我来说更惯用了。如果枚举是使用符号定义的,并且可以使用符号查询,那么在比较类似conversation.status == "active"
之类的东西时,为什么我不得不(必须记住!)使用字符串?
我的想法是覆盖getter:
def status
super.try(:to_sym)
end
这样,我总是可以使用符号。有任何合理的理由不这样做吗?
答案 0 :(得分:1)
但是您不能使用符号进行比较:
conversation = Conversation.new(status: :active)
conversation.status # "active"
conversation.status == :active # false
您不需要与符号进行比较:
conversation.active? # true
有任何合理的理由不这样做吗?
是的,您应该使用库的方法和模块,而不是编写自己的未经测试的多余代码。
答案 1 :(得分:1)
无需将枚举与字符串或整数进行比较。 DOC Link
conversation = Conversation.new(status: :active)
conversation.active? #true/false