目前我使用常量来处理* 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
答案 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)比较的原因。字符串是不同的。
您的目标是:
由于任务类型存储在数据库中(我假设模型),我会更加关注可以优化SQL查询的内容,而不是可以降低Ruby中比较成本的内容。
我的第一个选择是使用普通字符串。否则我会使用整数,因为任何Ruby ORM和任何数据库都能很好地理解它们。
class TaskType
TWITTER_MENTION_REPLY = 0
...
end