Ruby on rails Rails枚举,如何从数组中删除值?

Ruby on rails Rails枚举,如何从数组中删除值?,ruby-on-rails,enums,Ruby On Rails,Enums,这是我第一次使用rails枚举 我的应用程序中有一个角色的用户模型。要管理角色,我使用enum enum professional_role: ProfessionalRole.all 职业角色是一门课 class ProfessionalRole def self.all %i(altro amministrazione segreteria buyer buyer_audiovideo_consumer_electron

这是我第一次使用rails枚举

我的应用程序中有一个角色的用户模型。要管理角色,我使用enum

enum professional_role: ProfessionalRole.all
职业角色是一门课

 class ProfessionalRole
  def self.all
    %i(altro
       amministrazione
       segreteria
       buyer
       buyer_audiovideo_consumer_electronics_home_entertainment
       buyer_fotografia_photo
       buyer_grandi_elettrodomestici_mda_home_confort
       buyer_it_information_technology
       buyer_piccoli_elettrodomestici_sda
       buyer_telefonia_telecomunicazioni
       capi_area
       comunicazione_hr
       direzione
       marketing
       edp)
  end
 end
我需要从数组中删除一些值,当然我没有具有该角色的用户,但是删除每个用户角色的一些值是错误的,因为我缩短了数组。我怎样才能解决它


我找到的唯一解决方法是将用户和角色保存到CSV中,然后修改数组并从CSV文件中重新保存每个用户及其角色。

要能够从枚举值数组中删除任何项而不弄乱数据,请将其转换为哈希:

{
   altro: 0,
   segreteria: 2,
   # and so on...
   direzione: 123,
   marketing: 200,
}

枚举作为整数存储在数据库中。当隐式声明枚举时(不告诉Rails值应该映射到哪个整数),Rails会猜测第一个值映射到0,第二个值映射到1,依此类推。因此,Rails正在将代码转换为以下哈希:

{ altro: 0, amministrazione: 1, segreteria: 2, buyer: 3,
  buyer_audiovideo_consumer_electronics_home_entertainment: 4,
  buyer_fotografia_photo: 5,
  buyer_grandi_elettrodomestici_mda_home_confort: 6,
  buyer_it_information_technology: 7,
  buyer_piccoli_elettrodomestici_sda: 8,
  buyer_telefonia_telecomunicazioni: 9, capi_area: 10,
  comunicazione_hr: 11, direzione: 12, marketing: 13, edp: 14 }
如果只删除其中一项,Rails会假定您知道自己在做什么。假设您删除了枚举中的
altro
,那么它假设
amministrazione
应该映射到0,这显然是错误的。您仍然希望将其映射到1,但不再希望将0映射到任何对象。您可以通过在数据库中进行搜索和替换来修复此问题,并将所有
professional\u角色
列减为1,但这非常麻烦

要解决此问题,需要显式声明枚举,并说明希望将这些值映射到哪个整数。假设您要删除
altro
segreteria
并像以前一样保留其他映射,则需要将枚举声明为:

enum professional_role: {
  amministrazione: 1, buyer: 3,
  buyer_audiovideo_consumer_electronics_home_entertainment: 4,
  buyer_fotografia_photo: 5,
  buyer_grandi_elettrodomestici_mda_home_confort: 6,
  buyer_it_information_technology: 7,
  buyer_piccoli_elettrodomestici_sda: 8,
  buyer_telefonia_telecomunicazioni: 9, capi_area: 10,
  comunicazione_hr: 11, direzione: 12, marketing: 13, edp: 14
}
如果您仍然想使用
ProfessionalRole
类,只需添加一个返回上述散列的方法


有关更多信息,请参见让我们假设您有一个
或一个
模型
与此
枚举

enum piece_status: {
  in_progress:        0,
  available:          1,
  reserved:           2,
  donated:            3,
  sold:               4,
  not_for_sale:       5,
  piece_destroyed:    6,
  archived:           7
}
您可以使用
concers
(运行
rails
MVC
webapp)加载它,这是您删除要隐藏的
X
Y
原因的选项的地方

def set_available_piece_status_options
  @piece_statuses_options = Piece.piece_statuses.keys.map{|k| [k.humanize, k]}
  #by default users can not create/update pieces to donated and sold
  @piece_statuses_options.delete(["Donated", "donated"]) # <=== DELETE
  @piece_statuses_options.delete(["Sold", "sold"]) # <=== DELETE
end
根据需要进行自定义,因为某些页面可能需要在枚举中包含所有选项,您只需创建新的
关注点
方法并使用它即可

  before_action :A, :B, :C, :set_available_piece_status_options, :D