Как Rails работает со значениями перечисления метода-недружественного имени? - PullRequest
1 голос
/ 04 октября 2019

У меня есть класс (Rails), который имеет следующее значение перечисления:

class DeploymentRequest
  enum frequency: ['One-off', 'Monthly', 'Quarterly', 'Annual']
  #...
end

Согласно документам (хотя, к моему удивлению, с учетом регистра), DeploymentRequestимеет такие методы экземпляра, как #Monthly?, #Monthly!, #Quarterly? и т. д. (и метод класса .Monthly). Но одноразовое значение - это бросить его и / или меня. Я пробовал

dr.One_off?
dr.Oneoff?
dr.oneoff? # (one lives in hope)

Но ни одна из них не работает (и Pry / IRB не предлагает никаких полезных альтернатив). Что тут происходит? Rails просто не определил какой-либо такой набор методов, или он назвал их так, как я не нашел?

Ответы [ 2 ]

4 голосов
/ 04 октября 2019

Rails преобразует эти перечисления в символы. Вы сможете увидеть некоторые из этих методов, посмотрев на разницу в методах экземпляра между вашей моделью и ActiveRecord :: Base (при условии, что вы используете это):

DeploymentRequest.instance_methods - ActiveRecord::Base.instance_methods
> [:Quarterly?, :Quarterly!, :Annual?, :Annual!, :"One-off?", :"One-off!", :Monthly?, :Monthly!, ....

Вы можете видеть, чтометод, который вам нужен, это: «Один раз?», который трудно назвать. Но вы можете использовать send:

dr.send(:"One-off?")

Ugly, но без изменения значения enum может быть единственным вариантом.

1 голос
/ 05 октября 2019

Это довольно грубое злоупотребление ActiveRecord::Enum. Он не предназначен для хранения удобных для человека строк, которые вы хотите использовать на веб-интерфейсе. Скорее, он предназначен для отображения набора целых чисел в базе данных на именованные состояния в модели. Если отображение не соответствует соглашениям Ruby для именования методов , вы делаете это неправильно.

Если вы хотите отобразить сопоставления перечисления на внешнем интерфейсе, вам следует использовать модуль I18nили какой-либо другой вид отображения, который отображает ключи перечисления в удобочитаемую версию:

en:
  deployment_request:
    frequencies:
      one_off:  'One-off'
      monthly:  'Monthly'
      quarterly: 'Quarterly' 
      annual: 'Annual'

I18n.t :"deployment_request.frequencies.#{deployment_request.frequency}"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...