目前我使用常量来表示*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/