我的应用程序有许多选项列表,例如,管理项目所在的阶段 - 这些是用户从select
列表中选择的选项。我有很多这样的问题,我遇到了组织问题,即在一个地方定义这些问题,以便系统保持干燥状态。
我还担心为了规范化而生成大量的多态表,这有时会使代码复杂化,而不会在实际价值方面增加太多。
你能给我一个例子,说明在哪里存储一些选项:1)一个字段可能的唯一选项,以及2)在系统范围内以任何形式提供吗?
答案 0 :(得分:2)
我在这种情况下使用symbolize
gem。您可以将字段选项存储为字符串,对模型值执行操作作为符号,使用i18n作为标签,甚至还有一组帮助程序可以根据选项构建select
。
此外,代码保持非常干净,因为您在模型本身上设置了可用选项。
检查出来:
https://github.com/nofxx/symbolize
以下是他们的文档中的示例:
class User < ActiveRecord::Base
symbolize :gender, :in => [:female, :male], :scopes => true
symbolize :so, :in => {
:linux => "Linux",
:mac => "Mac OS X"
}, :scopes => true
# Allow blank
symbolize :gui, :in => [:gnome, :kde, :xfce], :allow_blank => true
# Don`t i18n
symbolize :browser, :in => [:firefox, :opera], :i18n => false, :methods => true
# Scopes
symbolize :angry, :in => [true, false], :scopes => true
# Don`t validate
symbolize :lang, :in => [:ruby, :c, :erlang], :validate => false
# Default
symbolize :kind, :in => [:admin, :manager, :user], :default => :admin
end
答案 1 :(得分:1)
由于ActiveRecord不支持ENUM
或SET
属性,这完全适合您所需要的,数据库方面,我认为最好的方法是将这些数据存储在一个常量,put在初始值设定项中(例如conf/initializers/constants.rb
)。通过这种方式,您可以使用它们构建<select>
标记并在模型中构建(例如使用validates :field, :inclusion => ALLOWED_VALUES
)。如果将常量存储在应用程序控制器中,则无法在模型中访问它。
答案 2 :(得分:0)
在appcontroller中存储常量数组会解决您的问题吗?
class ApplicationController < ActionController::Base
OPTIONS = ["option1", "option2", "etc"]
end