[我刚开始使用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作为数据库。
谢谢!
答案 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