ruby-on-rails - 如何在RoR中结合常数和符号的好处?

标签 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

但问题是,当将其保存到数据库时,保存的字段如下所示:--:twitter_mention_reply

最佳答案

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

您的目标是:

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

由于任务类型存储在数据库中(我想是沿着模型),我会更关心什么可以优化 SQL 查询,而不是可以降低 Ruby 中的比较成本。

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

class TaskType
    TWITTER_MENTION_REPLY = 0
    ...
end

关于ruby-on-rails - 如何在RoR中结合常数和符号的好处?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4296325/

相关文章:

ruby-on-rails - 从 Controller 调用应用程序助手的最佳方式是什么?

c++ - 为什么 operator++ 返回一个非常量值?

char - Const Char* test() return String.c_Str() 无法正常工作

java - 从docx中提取符号字符

ruby-on-rails - npm 错误 : tunneling socket could not be established, 原因=连接 ETIMEDOUT

ruby-on-rails - .select 和或 .where 是否负责在 Rails 中引起 N+1 查询?

ruby-on-rails - 如何使用法拉第模拟 rspec 中的请求超时

pointers - LLVM Compiler Infrastructure 中是否有一种方法可以将指针常量转换为不同类型的指针常量?

python - 仅符号字符串检测

url - 有 #!网址中的组合有特殊含义吗?