Rails Enum,如何从数组中删除一个值?

时间:2016-07-07 16:11:43

标签: ruby-on-rails enums

这是我第一次使用rails enum。

我的应用中有一个角色的用户模型。要管理角色,我使用枚举

enum professional_role: ProfessionalRole.all

ProfessionalRole是一个类

 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文件中的角色重新保存每个用户。

3 个答案:

答案 0 :(得分:1)

枚举在数据库中存储为整数。当你隐式声明枚举时(不告诉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_role列减1,但这非常麻烦。

要解决此问题,您需要显式声明枚举,并说明要将这些值映射到的整数。假设您要删除altrosegreteria并保留其他映射,您需要将枚举声明为:

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类,只需添加一个返回上述哈希的方法。

有关详细信息,请参阅http://api.rubyonrails.org/classes/ActiveRecord/Enum.html

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

让我们假设您的ClassModelenum

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),在这里您可以删除要为XY隐藏的选项原因

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
  • 请注意如何使用delete中的hash.delete(key)函数

您的控制器就像

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

根据需要进行自定义,因为某些页面可能需要在枚举中包含所有选项,您可以只创建新的concern方法并使用它