Dou*_*oug 32 html enums ruby-on-rails rails-models
对于Rails 3.0 Todo应用程序,我有一个带有Status字段的Tasks模型.存储状态字段数据(字段类型)的最佳方法是什么,并且仍然在视图(HTML表格)中显示人类可读的版本?状态可以是:
0 =正常
1 =有效
2 =已完成
现在我有这个:
create_table"tasks",:force => true do | t |
t.integer"status",:limit => 1 ,: default => 0,:null => false
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)
<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)
将任务的状态存储在数据库中,以便值可以轻松进行本地化,即我不确定是否要将"正常","活动","已完成"存储为字符串字段.
解决方案必须与Rails 3.0一起使用.
我应该将字段存储为整数(见上文)?如果是这样,我如何在我的Rails视图中的HTML表格中显示正确的人类可读状态,例如在HTML表格中显示"活动"而不是"1".
我应该使用枚举吗?如果是这样,以后这很容易本地化吗?
我应该使用直字符串,例如"Normal","Active","Completed"
您能否提供视图助手,控制器或视图代码的快速代码示例以使其工作?
Vla*_*anu 43
1.这取决于您希望在DB上优化查询的程度.
2.实际上,AR不支持"开箱即用".#从Rails开始,4开始支持枚举.
3.IMHO您可以使用字符串而不会造成很大的性能损失(只需记住向索引添加字段).我会这样做,因为它更容易国际化和维护.但是,如果需要额外的性能,可以使用整数.
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)
最简单的方法是将实际字符串存储在字段中,而不是添加另一个表.根据您的观点,这可能是一个坏主意,因为您的数据库不会被充分规范化或者一个好主意,因为您的应用程序现在更有效地进行规范化.
如果您选择不这样做并将值保存在单独的表中; 您需要在模型中设置关系.
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)
| 归档时间: |
|
| 查看次数: |
10752 次 |
| 最近记录: |