【问题标题】:Rails Enum, how to remove a value from the array?Rails Enum,如何从数组中删除一个值?
【发布时间】:2016-07-07 16:11:42
【问题描述】:

这是我第一次使用 rails 枚举。

我的应用程序中有一个角色的用户模型。为了管理我使用枚举的角色

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

【问题讨论】:

    标签: ruby-on-rails enums


    【解决方案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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

        假设您有一个Class 或一个Model 和这个enum

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

        你的控制器就像

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2023-03-31
          • 1970-01-01
          • 2015-12-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-04-19
          相关资源
          最近更新 更多