Ruby on rails Rails枚举,如何从数组中删除值?
这是我第一次使用rails枚举 我的应用程序中有一个角色的用户模型。要管理角色,我使用enumRuby 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
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