我想知道什么是效果和事情要考虑当你更新枚举定义在你的模型?或者这是你应该避免做的事情?如果我已经在表上有一百万条记录,并想将定义从这个更改为这个,该怎么办?
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将提供一些有用的助手来使用它们。