Ruby on rails 向ActiveRecord枚举字段添加属性

Ruby on rails 向ActiveRecord枚举字段添加属性,ruby-on-rails,activerecord,Ruby On Rails,Activerecord,我的Rails 4应用程序中有用户模型。它包含帐户类型的枚举 class User < ActiveRecord::Base enum account_type: [manager: 0, contractor: 1, employee: 2] end class用户0 Conversation.status[“存档”]#=>1 -- 与您的问题不同的是,如果您想向enum功能添加更多规范,您实际上进入了另一个模型的领域 正如@errata所述,如果您想使用示例,最好使用基于角色的功

我的Rails 4应用程序中有
用户
模型。它包含帐户类型的枚举

class User < ActiveRecord::Base
  enum account_type: [manager: 0, contractor: 1, employee: 2]
end
class用户
目前,
account\u type
用于修改多个操作的行为。但在将来,我需要介绍几个属性,这些属性对于不同的帐户类型具有不同的值(例如,某些API端点的费率限制或订阅价格)

我该怎么处理


我可以添加新的模型
UserAccountType
模型并将
归属设置为
-
在它和
User
模型之间有许多
关联链接,但我将无法访问
manager?
之类的方法,这些方法由
ActiveRecord
方便地提供。此外,我还必须适当地为相关表设置种子,这意味着我必须将映射“account type”整数放置在
seeds.rb中,并确保它为所有帐户类型创建记录,这些记录都是非干燥的。有没有更好的方法?

看起来您正在寻找一个简单的角色系统。Rolify gem非常适合这一点:。在所包含的方法之上添加额外的方便方法也很容易

已经有足够多的人试图解决这个问题,以至于出现了一些模式。例如,您确定在项目生命周期中,每个用户一个角色就足够了吗?您可能需要数组类型(或一对多)而不是枚举

如果您想自己实现它,如果您使用Postgres,那么数组字段类型可能是存储和添加“角色”的好方法。至于方便的方法,您可以替换类似is_manager的东西?几行。我不会让这阻止你创建一个更合适、更可持续的数据模型

例如:

def is_manager?
  User.find(1).roles.include?('manager')
end

当您提到希望向
enum
对象添加额外属性时,您必须小心理解要添加的内容

根据:

声明一个枚举属性,其中值映射到数据库中的整数,但可以按名称查询

基本上,这意味着
enum
属性的存储值将是一个数字;Rails将把这个数字“翻译”成它的详细形式。如果需要,可以使用单实例方法轻松实现

因此,您提供给我们的用例无效:

请注意,使用数组时,从值到数据库整数的隐式映射是根据值在数组中的显示顺序派生的。在本例中,:active作为第一个元素映射到0,:archive映射到1。通常,第i个元素映射到数据库中的i-1

Conversation.status[:active]#=>0

Conversation.status[“存档”]#=>1

--

与您的问题不同的是,如果您想向
enum
功能添加更多规范,您实际上进入了另一个模型的领域

正如
@errata
所述,如果您想使用示例,最好使用基于角色的功能

你从大型项目中得到的最好的东西之一就是需要明确功能。说“我需要一个新模型”很容易,但理解它在功能层面上的作用却大不相同

因此,我建议您看看您正试图实现的目标。如果需要“额外”属性等,则需要另一个模型。如果只使用单个值,请坚持使用
enum


某些API端点的速率限制或订阅价格

我个人会使用如下内容:

#app/models/user.rb
class User < ActiveRecord::Base
   belongs_to :account_type
   delegate :rate_limit, to: :account_type #-> @user.rate_limit.speed
end 

#app/models/account_type.rb
class AccountType < ActiveRecord::Base
   has_many :users
   belongs_to :rate_limit #-> maybe
end

也许可以使用更灵活的方法,但上述方法应该可以。

我明白我最终想要实现的目标,我只是缺乏rails方面的经验。例如,我以前不知道
delegate
,它看起来真的可以避免我在使用模型时大量打字。谢谢你能给我指一下正确的方向吗?数据库应该如何添加帐户类型种子?费率限制与角色相关,因此
AccountType
必须具有
role
整数字段。
@user = User.find x
@user.rate_limit.throttle