正在更新模型中的枚举定义



我想知道什么是效果和事情要考虑当你更新枚举定义在你的模型?或者这是你应该避免做的事情?如果我已经在表上有一百万条记录,并想将定义从这个更改为这个,该怎么办?

class Post < ApplicationRecord
enum :status, { published: 0, draft: 1, archived: 2 }
end
class Post < ApplicationRecord
enum :status, { published: 0, draft: 1, edited: 2, deleted: 3 }
end

一般来说,在表中添加和删除列时应该考虑什么?

enum不向表中添加新列,它代表列的可能值。

如果最初的枚举是{ published: 0, draft: 1, archived: 2 },最终改成了{ published: 0, draft: 1, edited: 2, deleted: 3 },这应该是一个大问题,因为你改变了值引用。

例如,如果一开始你有一个Post存档post(意味着数据库中的status值为2,根据enum),现在是编辑,则会发生如下情况:

老:

@post.status #=> 'archived'
@post.archived? #=> true
>(我的意思是不更新数据库。如果你只是在你给出的例子中改变模型中的enum,它就会发生):
@post.status #=> 'edited'
@post.archived? #=> false
@post.edited? #=> true

它改变了值,因为列data(2)代表的值不再是您最初拥有的值(:archived => 2)。

当使用枚举时,您应该总是在枚举定义中添加不同的值,因此它表示不同的内容。

在你的例子中,我觉得它可以是:

enum :status, { published: 0, draft: 1, edited: 3, deleted: 4 },所以它不引用旧值(:archived => 2)。

这样,你就有了不同的引用,如果你想添加归档的,它也不会中断。回到不久的将来:

enum :status, { published: 0, draft: 1, archived: 2, edited: 3, deleted: 4 }

Enum将不会在表中添加新列。它只是在同一列中有不同的值。例如,根据您的新定义,存档的帖子现在是编辑的帖子,也会有新的删除的帖子。在数据库级别,现在它将在同一列中有三个不同的值——0、1、2、3。

enum的另一个优点是Rails将提供一些有用的助手来使用它们。

最新更新