选择类型字段的菜单,并将整数映射到rails中的文本

时间:2013-01-31 12:33:03

标签: ruby-on-rails database postgresql gem formtastic

[我刚开始使用rails,我希望这不是一个愚蠢的问题,看到类似的问题,但它适用于PHP而且对我的情况没有帮助]

为了解释我的问题,我在这里使用类比给用户。假设我的应用程序中有users表,我在用户表中添加了一个名为user_type的字段。现在我想指定哪种类型的用户。

假设我有5种类型的用户,例如。主持人,管理员,消费者等。

我不想让user_type字段成为字符串类型来存储用户类型。相反,我想让user_type存储integer,然后将这些整数值映射到相应的字符串值。 这种方法的优点是我可以更改调用用户类型的内容。假设我不再希望将消费者称为消费者,而是希望将其称为其他消费者。

我相信在db中存储整数更好,并提供一些灵活性。

我知道我可以使用formtastic创建选择菜单(我使用active_admin作为管理面板,formtastic用于表单)

 <%= f.input :user_type, :as => :select, :collection => { 
        0    => "Admin", 
        1   => "Moderator",
        2 => "Consumer",
    } %>

然后将值存储在db中,然后从db中选择这些用户。

我想知道是否有更好的方法或方法在rails中执行此操作或有一些宝石可用于执行此操作或您喜欢的其他方法以及您推荐它的原因。

我正在使用postgresql作为数据库。

谢谢!

2 个答案:

答案 0 :(得分:3)

我个人喜欢将active_enum gem组合到simple_form,因为它实现起来非常简单,而且它们可以很好地协同工作。

在你的情况下,你必须定义一个这样的枚举类:

class Type < ActiveEnum::Base
  value 1 => 'Admin'
  value 2 => 'Moderator'
  value 3 => 'Consumer'
end

然后在您的User模型中,您只需添加以下内容:

enumerate :user_type, :with => Type

simple_form的真正优点是你只需要打电话:

<%= f.input :user_type =>

获取包含所有值的select

答案 1 :(得分:2)

试试这个

# user.rb
USER_TYPES = { moderator: 1, superuser: 2, admin: 3, client: 4 }

# views
select :user, :user_type, User::USER_TYPES

这会将整数值保存到数据库中。如果要获得等效的字符串,请使用User::USER_TYPES.key(@user.user_type)

编辑:忘了添加范围

scope :moderators, where(user_type: USER_TYPES[:moderator])
scope :superusers, where(user_type: USER_TYPES[:superuser])
...

USER_TYPES.each do |user_type, value|
  scope :"#{user_type}s", where(user_type: USER_TYPES[user_type])
end