文档结构  
翻译进度:已翻译     翻译赏金:0 元 (?)    ¥ 我要打赏

当我以前在呼叫中心工作的时候,我习惯给各种案例标识不同的状态。这有助于上层管理从这些电话记录中掌握以下信息,哪些案例是独立的,哪些是瓶颈所在。幸运的是,从我在呼叫中心工作时起,我一直在考虑如何用Rails来帮助我完成这些工作。 非常值得庆幸,Rails提供了叫做Enums的解决方案。

当你为一个实例添加状态时,你可能会尝试用字符串来标识状态。这种情况看起来很完美,因为不同的状态往往被命名为“待定”,“审查”,“完成”。

第 1 段(可获 1.33 积分)

然而,Rails鼓励你利用枚举来将这些字符串替换为整数,起初看起来有违常理,但是实际上是适和这个问题的完美方案。

枚举允许你将字符串映射到数据库中的整数,这样的话你可以用名称字符串来查询:

class CustomerCase < ApplicationRecord
  enum status: [:open, :closed,:under_review, :pending]
end

现在我们可以用Rails控制台做到以下几点:

$ customer_case.open?

我们的可用区域:

$ CustomerCase.open

这样我们就可以真正的练习使用枚举了,我个人强烈建议创建一个小的Rails应用来试试:

第 2 段(可获 1 积分)
$ rails new call_center

切换到该目录生成一个有很多属性的快速开发框架:

$ rails generate scaffold CustomerCase title:string description:text status:integer agent:string

注意:status 字段是整数型。

数据库迁移命令:

$ rails db:migrate

打开app/models/customer_case.rb 然后输入以下代码:

class CustomerCase < ApplicationRecord
  enum status: [:open, :closed, :under_review, :pending]
end

记住这个ActiveRecord记录

现在我们有一个小应用启动并运行了。在Rails控制台上继续创建几个不同属性的示例再试试:

第 3 段(可获 0.83 积分)
$ CustomerCase.create(title: "Case 1", description: "Our first case", status: :open, agent: "Me")
=> #<CustomerCase id: 1, title: "Case 1"...status: "open"
$ CustomerCase.create(title: "Case 2", description: "Our second case", status: :pending, agent: "Me")
=> #<CustomerCase id: 2, title: "Case 2"...status: "pending"

这也是改变app/views/customercase/form.html.erb路径的一个好主意。对应枚举你就能找出实际的状态:

...
</div>
<div class="field">
  <%= f.label :status %><br>
  <%=  f.collection_select :status, CustomerCase.statuses.map{ |a| [a.first,a.first] },  :first, :second %>
</div>
第 4 段(可获 0.36 积分)

我建议在Rails控制台创建尽可能多的差异用例来测试不同的可能性:

$ bundle exec rails c
$ cse = CustomerCase.create(title:"Case Title", description:"what has happend", status: "open" )
$ cse.open?
=> true
$ cse.closed?
=> false
$ cse.pending?
=> false
$ CustomerCase.open.to_a
CustomerCase Load (0.1ms)  SELECT "customer_cases".* FROM "customer_cases" WHERE "customer_cases"."status" = ?  [["status", 0]]
=> #<ActiveRecord::Relation..

最后一个示例调用公开区域来展示用SQL查询数据库,查询使用0作为值,如同预期那样,是不公开的。

第 5 段(可获 0.53 积分)

你也可以用下面的例子来改变状态:

$ cse.pending!

(0.1ms) 开始事务
SQL (1.0ms) UPDATE “customercases” SET “status” = ?, “updatedat” = ? WHERE “customercases”.”id” = ? [[“status”, 3], [“updatedat”, 2016-10-05 13:34:28 UTC], [“id”, 3]]
(0.6ms) 提交事务
=> true

本作者的更多文章

如果使用得当,我们用枚举除了能创建轻松易读的代码,还探索出枚举的其他用例。我由衷的希望它会实现其他Enum-related特性来使你的Rails应用程序变得更容易。

第 6 段(可获 1.26 积分)

文章评论