如何在RoR中结合常量和符号的优点?

时间:2010-11-28 10:20:23

标签: ruby-on-rails constants symbols

目前我使用常量来处理* 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

但问题是当它保存到db时,保存的字段如下所示: - :twitter_mention_reply

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:2)

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

您的目标是:

  • 有一组任务类型可供选择,TaskType :: SOME_CONSTANT可供选择
  • 将TaskType保存到数据库中
  • 降低任务类型之间的比较成本

由于任务类型存储在数据库中(我假设模型),我会更加关注可以优化SQL查询的内容,而不是可以降低Ruby中比较成本的内容。

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

class TaskType
    TWITTER_MENTION_REPLY = 0
    ...
end
相关问题