Ruby on rails 如何结合RoR中常量和符号的优点?

Ruby on rails 如何结合RoR中常量和符号的优点?,ruby-on-rails,constants,symbols,Ruby On Rails,Constants,Symbols,目前,我使用常量来表示*task\u 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\u 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

但它的问题是,在将其保存到db时,保存的字段如下所示:——:twitter\u title\u reply

在保存到db之前将其转换为字符串可能会有所帮助:

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

符号的优点来自具有对象标识符的符号;这就是符号之间O(1)比较的原因。字符串是不同的

你的目标是:

  • 使用TaskType::SOME_常量选择一组任务类型
  • 将TaskType保存到数据库中
  • 降低任务类型之间的比较成本
由于任务类型存储在一个数据库中(我想是沿着一个模型存储的),所以我更关心的是什么可以优化您的SQL查询,而不是什么可以降低Ruby中的比较成本

我的第一个选择是使用普通字符串。否则,我将使用整数,因为任何Ruby ORM和任何数据库都能很好地理解它们

class TaskType
    TWITTER_MENTION_REPLY = 0
    ...
end

因此,您建议使用TWITTER\u-title\u-REPLY=:TWITTER\u-title\u-REPLY方法?Ruby中的字符串->符号/符号->字符串的成本是多少?您是否使用ActiveRecord或任何ORM?您好,谢谢。TWITTER\u-title\u-REPLY=:TWITTER\u-title\u-REPLY方法的缺点是什么?实际上,ActiveRecord无法映射符号;符号不是字符串,
——:twitter\u notice\u reply
是给定符号的序列化。从哲学上讲,符号代表其他事物,而在这种情况下,它们只代表自己。最终,有一个比我聪明得多的人在这里解释了符号:)