在select_tag帮助程序中手动将表单选项列为字符串是不是很麻烦?
另外,我想知道 - 我如何实际使用所选值来更新数据库?
<div class="form-group">
<%= f.label :sex %><br />
<%= select_tag(:sex_id, options_for_select(
[
["Not known", 0], ["Male", 1], ["Female", 2], ["Not applicable", 3]
]
)) %>
答案 0 :(得分:2)
This question概述了使用enum
in ActiveRecord (Rails 4.1+)映射到整数的过程。
数据库中类型integer
的属性可以在相应的模型中声明(我假设为User
):
enum gender: [:not_known, :male, :female, :not_applicable]
在视图中,您可能依赖于系统需要相应字符串而不是整数的事实:
<%= f.input :gender, as: :select, collection: User.genders.keys %>
或者自己绘制地图以生成您想要的内容:&#34;人类可读的名称&#34;甚至是i18n键:
<%= f.input :gender, as: :select,
collection: User.genders.keys.map { |w| [w.humanize, w] } %>
<%= f.input :gender, as: :select,
collection: User.genders.keys.map { |w| [(t ".w"), w] } %>
答案 1 :(得分:1)
将选项硬编码到视图中的方式往往会使查找变得困难,并且无法进行本地化/国际化。
有很多方法可以做得更好。以下是您可以考虑的内容。
使用提供枚举的模块,例如:
module Gender
UNKNOWN = 0
MALE = 1
...
使用常量哈希查找,例如:
GENDER = {
0 => "Not Known",
1 => "Male",
...
使用索引为id的常量数组,例如:
GENDER = [
"Not Known",
"Male",
...
使用一组结构,例如属性键值对:
GENDER = [
{id: 0, label: "Not Known"},
{id: 1, label: "Male"},
...
使用数据库表,例如:
class Gender < ActiveRecord::Base
# has fields for id and name
end
使用Rails 4.1枚举:
class User < ActiveRecord::Base
enum gender: [ :unknown, :male, ... ]
...
这些选项中的每一个都有优势。
一般情况下,我建议将数据库表方法用于典型的Web应用程序或典型的API;表格方法有许多优点,可以更轻松地进行范围界定,搜索,排序,使用管理工具自动显示等。
一般情况下,我建议使用模块方法,如果您需要高速,或者存储限制非常严格,或者想要将localizaiton / internationalization字符串保留在其他地方,例如YAML文件;模块方法存储了最少量的必要信息。
对于性和性别,请注意这些因地区和用户群而异。例如,一些国家有第三性别,有些情况需要“拒绝回答”,有些群体区分性别和性别等。