1

[我是 Rails 新手,我希望这不是一个愚蠢的问题,看到了一个类似的问题,但它适用于 PHP,对我的情况没有帮助]

为了解释我的问题,我在这里对用户进行了类比。假设我users的应用程序中有表格,我添加了一个名为user_typeusers 表格的字段。现在我想指定用户的类型。

假设我有 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 中执行此操作,或者是否有一些 gem 可以执行此操作或您喜欢的其他方法以及为什么推荐它。

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

谢谢!!

4

2 回答 2

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你所有的价值观。

于 2013-01-31T12:51:30.527 回答
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
于 2013-01-31T12:44:26.363 回答