繁体   English   中英

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

[英]Rails Enum: overriding getter to always compare with symbols instead of strings

查看ActiveRecord的Enum 文档 ,我发现不一致的是,有时允许我使用符号,有时只需要使用字符串。

在文档中,您可以使用符号查询:

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

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

但是您不能使用符号进行比较:

conversation = Conversation.new(status: :active)
conversation.status # "active"
conversation.status == :active # false

您不需要与符号进行比较:

conversation.active? # true

有任何合理的理由不这样做吗?

是的,您应该使用库的方法和模块,而不要编写自己的未经测试的多余代码。

无需将枚举与字符串或整数进行比较。 DOC链接

conversation = Conversation.new(status: :active)
conversation.active? #true/false

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM