Rails枚举:重写getter始终与符号而不是字符串进行比较

时间:2018-06-30 12:59:23

标签: ruby-on-rails

从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

这样,我总是可以使用符号。有任何合理的理由不这样做吗?

2 个答案:

答案 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