【发布时间】:2009-03-08 01:36:40
【问题描述】:
我有一个将值存储为 2 个字符的状态字段。例如,阿拉巴马州保存为 AL,阿拉斯加州保存为 AK,亚利桑那州保存为 AZ 等。在 show.html.erb 中,如何显示阿拉巴马州等州的长名称,而不是只显示 AL?这可能吗,还是我应该将长名称存储在数据库中,例如 Alabama、Alaska、Arizona 等?
【问题讨论】:
标签: ruby-on-rails ruby forms
我有一个将值存储为 2 个字符的状态字段。例如,阿拉巴马州保存为 AL,阿拉斯加州保存为 AK,亚利桑那州保存为 AZ 等。在 show.html.erb 中,如何显示阿拉巴马州等州的长名称,而不是只显示 AL?这可能吗,还是我应该将长名称存储在数据库中,例如 Alabama、Alaska、Arizona 等?
【问题讨论】:
标签: ruby-on-rails ruby forms
编写一个输出状态长名称的方法并在show.html.erb中调用它
some_model.rb:
SomeModel < ActiveRecord::Base
STATE_CODES = {
"AL": "Alabama", "AK": "Alaska",
# add remaining 50
}
def state_human_name
STATE_CODES[self.state]
end
show.html.erb:
<%= record.state_human_name %>
编辑:在您的数据库中存储状态的全名没有帮助——您至少在某处需要短格式,因此无论如何都需要在短格式和长格式之间添加映射。
【讨论】:
是否有理由使用 2 个字母代码(例如旧数据库)?如果不是,我会坚持通常的 ActiveRecord 习语,并有一个由 id 链接的单独“状态”表。如果您需要 2 个字母代码用于显示、打印地址标签或其他任何内容,则将“state_code”属性添加到 states 表,但不要将其用作主键。
【讨论】:
我将此放在评论中,但我认为它的不同之处足以值得回答。
当您决定将州地图保存在哪里时,请考虑您是否需要将物品运送到加拿大或更远的地方。如果是这样,那么值得努力建立一个与国家表相关联的州表。
无论如何,如果您的数据很少更改,那么将其放入数据库就不太容易出现问题,因为代码更改的频率要高得多。更频繁的更改 = 更多搞砸的机会。此外,您可以轻松地进行排序。
class State < ActiveRecord::Base
def self.get_states
@@states || State.find(:all,
:include => :country,
:order => 'countries.name, long_name')
end
end
【讨论】:
Tilendor,我注意到如果我使用 STATE_CODES.invert,下拉菜单选择会乱序。例如,我的选项列表的前五行如下所示:
新罕布什尔州 俄亥俄州 科罗拉多州 明尼苏达 阿拉巴马州 ...
在我的 STATES_CODES 哈希中,我按以下顺序列出了以下内容:
"AL" => "阿拉巴马州", "AK" => "阿拉斯加", "AZ" => "亚利桑那州", “AR” => “阿肯色州”, "CA" => "加利福尼亚", ...
有没有办法让表单中列出的选项与 STATES_CODES 的顺序相同?也许按字母顺序排序?
【讨论】: