在Rails中,我应该如何为任务应用程序实现状态字段 - 整数还是枚举?

Dou*_*oug 32 html enums ruby-on-rails rails-models

对于Rails 3.0 Todo应用程序,我有一个带有Status字段的Tasks模型.存储状态字段数据(字段类型)的最佳方法是什么,并且仍然在视图(HTML表格)中显示人类可读的版本?状态可以是:

0 =正常
1 =有效
2 =已完成

现在我有这个:

Rails架构在这里:

create_table"tasks",:force => true do | t |
t.integer"status",:limit => 1 ,: default => 0,:null => false

Rails模型在这里:

class Task < ActiveRecord::Base
  validates_inclusion_of :status, :in => 0..2,
    :message => "{{value}} must be 0, 1, or 2"
Run Code Online (Sandbox Code Playgroud)

Rails在这里查看:

<h1>Listing tasks</h1>

<table>
  <tr>
    <th>Status</th>
    <th>Name</th>
    <th></th>
    <th></th>
    <th></th>
  </tr>

<% @tasks.each do |task| %>
  <tr>
    <td><%= task.status %></td>
    <td><%= task.name %></td>
    <td><%= link_to 'Show', task %></td>
    <td><%= link_to 'Edit', edit_task_path(task) %></td>
    <td><%= link_to 'Delete', task, :confirm => 'Are you sure?', :method => :delete %></td>
  </tr>
<% end %>
</table>
Run Code Online (Sandbox Code Playgroud)

要求

  1. 将任务的状态存储在数据库中,以便值可以轻松进行本地化,即我不确定是否要将"正常","活动","已完成"存储为字符串字段.

  2. 解决方案必须与Rails 3.0一起使用.

问题:

  1. 我应该将字段存储为整数(见上文)?如果是这样,我如何在我的Rails视图中的HTML表格中显示正确的人类可读状态,例如在HTML表格中显示"活动"而不是"1".

  2. 我应该使用枚举吗?如果是这样,以后这很容易本地化吗?

  3. 我应该使用直字符串,例如"Normal","Active","Completed"

  4. 您能否提供视图助手,控制器或视图代码的快速代码示例以使其工作?

Vla*_*anu 43

1.这取决于您希望在DB上优化查询的程度.

2.实际上,AR不支持"开箱即用".#从Rails开始,4开始支持枚举.

3.IMHO您可以使用字符串而不会造成很大的性能损失(只需记住向索引添加字段).我会这样做,因为它更容易国际化和维护.但是,如果需要额外的性能,可以使用整数.

您可以在这里这里讨论2个SO线程.

4.如果你想把它们保持为整数,这就是你如何做到这一点:

class Task << AR::Base
  NORMAL    = 1
  ACTIVE    = 2
  COMPLETED = 3


  STATUSES = {
    NORMAL    => 'normal',
    ACTIVE    => 'active',
    COMPLETED => 'completed'
  }

  validates_inclusion_of :status, :in => STATUSES.keys,
      :message => "{{value}} must be in #{STATUSES.values.join ','}"

  # just a helper method for the view
  def status_name
    STATUSES[status]
  end
end
Run Code Online (Sandbox Code Playgroud)

在视野中:

<td><%= task.status_name %></td>
Run Code Online (Sandbox Code Playgroud)

如果你想使用字符串,它会更简化:

STATUSES = ['normal', 'active', 'completed']
validates_inclusion_of :status, :in => STATUSES,
          :message => "{{value}} must be in #{STATUSES.join ','}"
Run Code Online (Sandbox Code Playgroud)


Mik*_*bee 6

最简单的方法是将实际字符串存储在字段中,而不是添加另一个表.根据您的观点,这可能是一个坏主意,因为您的数据库不会被充分规范化或者一个好主意,因为您的应用程序现在更有效地进行规范化.

如果您选择不这样做并将值保存在单独的表中; 您需要在模型中设置关系.

class Task < ActiveRecord::Base
    has_one :status
end

class Status < ActiveRecord::Base
    belongs_to :tasks
end 
Run Code Online (Sandbox Code Playgroud)

然后在您的视图中,您可以通过以下方式引用值:

<%= task.status %>
Run Code Online (Sandbox Code Playgroud)