这是我第一次使用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文件中的角色重新保存每个用户。
答案 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,但这非常麻烦。
要解决此问题,您需要显式声明枚举,并说明要将这些值映射到的整数。假设您要删除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
类,只需添加一个返回上述哈希的方法。
有关详细信息,请参阅http://api.rubyonrails.org/classes/ActiveRecord/Enum.html
答案 1 :(得分:0)
为了能够从枚举值数组中删除任何项而不会弄乱数据,请将其转换为哈希:
{
altro: 0,
segreteria: 2,
# and so on...
direzione: 123,
marketing: 200,
}
答案 2 :(得分:0)
让我们假设您的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),在这里您可以删除要为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
delete
中的hash.delete(key)
函数您的控制器就像
before_action :A, :B, :C, :set_available_piece_status_options, :D
根据需要进行自定义,因为某些页面可能需要在枚举中包含所有选项,您可以只创建新的concern
方法并使用它