Rails Enum: переопределяющий геттер, чтобы всегда сравнивать с символами вместо строк - PullRequest
0 голосов
/ 30 июня 2018

Глядя на документацию EnR ActiveRecord , я не согласен с тем, что иногда мне разрешают использовать символы, а иногда мне нужно использовать только строки.

Из документов вы можете делать запросы, используя символы:

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"?

Моя идея переопределить геттер:

def status
  super.try(:to_sym)
end

Таким образом, я всегда могу использовать символы. Любая разумная причина не делать этого?

Ответы [ 2 ]

0 голосов
/ 30 июня 2018

Нет необходимости сравнивать перечисление со строкой или целым числом. DOC Link

conversation = Conversation.new(status: :active)
conversation.active? #true/false
0 голосов
/ 30 июня 2018

Но вы не можете сравнить, используя символы:

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

Вам не нужно сравнивать символы:

conversation.active? # true

Есть разумная причина не делать этого?

Да, вы должны использовать библиотечные методы и модули вместо того, чтобы писать собственный непроверенный и лишний код.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...