Как совместить преимущества констант и символов в RoR? - PullRequest
2 голосов
/ 28 ноября 2010

в настоящее время я использую константы для таких вещей, как * task_type *:

class TaskType
    TWITTER_MENTION_REPLY = "twitter_mention_reply"
    TWITTER_FOLLOW = "twitter_follow"
    TWITTER_DM_REPLY = "twitter_dm_reply"
    TWITTER_RETWEET = "twitter_retweet"
end

, поэтому, когда я инициализирую новую задачу, я назначаю тип следующим образом:

new_task.task_type =  TaskType::TWITTER_MENTION_REPLY

преимущество этогоПодход заключается в том, что в случае, если константа введена неправильно, интерпретатор выдает ошибку.Недостатком является то, что сравнение строк стоит дорого, символы гораздо лучше для этого.Итак, вопрос в том, как объединить эти два преимущества?

Я попытался создать следующий класс:

class TaskType
     TWITTER_MENTION_REPLY = :twitter_mention_reply
end

, но проблема с ним заключалась в том, что при сохранении его в БД сохраненныеполе выглядит так: -: twitter_mention_reply

Ответы [ 2 ]

2 голосов
/ 28 ноября 2010

Преимущество символов происходит от символа, имеющего идентификатор объекта;вот причина сравнения O (1) между символами.Строки просто разные.

Ваши цели здесь:

  • Наличие набора типов задач на выбор с помощью TaskType :: SOME_CONSTANT на выбор
  • Сохранить TaskTypeв базу данных
  • Снижение стоимости сравнения между типами задач

Поскольку типы задач хранятся в базе данных (по всей модели, я полагаю), я бы больше позаботился о том, что можно оптимизироватьваш запрос SQL, чем то, что может снизить стоимость сравнения в Ruby.

Мой первый выбор будет использовать простые строки.В противном случае я бы использовал целые числа, поскольку они хорошо понятны любому Ruby ORM и любой базе данных.

class TaskType
    TWITTER_MENTION_REPLY = 0
    ...
end
2 голосов
/ 28 ноября 2010

Преобразование в строку перед сохранением в БД может помочь:

:twitter_mention_reply.to_s  # => "twitter_mention_reply"
# back to symbol
"twitter_mention_reply".to_sym  # => :twitter_mention_reply
...