在Rails 3中,我应该如何管理选择有限的模型列

时间:2011-05-17 17:07:33

标签: ruby-on-rails ruby-on-rails-3 drop-down-menu

在我的Rails 3应用程序中,我有许多模型,其列具有有限的选择(IE是选择框)。在这些情况下,为了管理选择而创建另一个模型和与原始模型的关系似乎有些过分。

我能想到的一个选择就是创建一个选择框并在那里做出选择,但这似乎不是很干。有没有人有一个很好的建议如何处理这种情况?

感谢您的光临。

4 个答案:

答案 0 :(得分:14)

您可以在模型中创建常量

# formatted as an array of options, option being an array of key, value
OPTIONS = [['Email', 'email'], ['Text', 'text'], ['Email and Text', 'both']]

validates_inclusion_of :field, :in => OPTIONS

然后可以使用它轻松填充视图中的选择菜单

使用formtastic的例子

<%= f.input :field, :as => :select, :collection => Model::OPTIONS %>

答案 1 :(得分:7)

我通常在模型中使用常量列表来执行此操作。

class Model < ActiveRecord::Base
  PROPERTY_OPTIONS = ['Option One', 'Option Two', ...]
  validates_inclusion_of :property, :in => PROPERTY_OPTIONS
end

在视图中:

<%= f.select :property, Model::PROPERTY_OPTIONS %>

答案 2 :(得分:1)

您还可以使用enum_column插件:https://github.com/electronick/enum_column

然后,您可以在视图中呈现您的选择框,如下所示:

<%= f.select :status, Model.columns_hash['status'].limit %>

(其中Model是一个示例模型名称,例如Book或Product,或者您的应用程序实际上是什么。)

答案 3 :(得分:0)

在某些情况下,我将创建一个选项哈希并使用类方法来显示和设置它们。例如,具有不同状态的问题模型可以这样完成:

def self.statuses
  {:open => 1, :closed => 2}
end

然后,您只需将整数值存储在模型的status_id中。您也可以配置getter / setter。