枚举属性很实用,我想使用它们。但是将枚举值映射到整数会使代码和数据库的维护变得困难。此外,我的数据库会与代码高度耦合,我认为这是一个不好的事情。
我知道可以使用哈希表来组织一个带有键/值对的枚举属性,但仍然最好能够使用数组并将其映射到数据库中的字符串值。
是否有默认的方法将枚举映射为字符串?
枚举属性很实用,我想使用它们。但是将枚举值映射到整数会使代码和数据库的维护变得困难。此外,我的数据库会与代码高度耦合,我认为这是一个不好的事情。
我知道可以使用哈希表来组织一个带有键/值对的枚举属性,但仍然最好能够使用数组并将其映射到数据库中的字符串值。
是否有默认的方法将枚举映射为字符串?
查看枚举的代码,您可以这样做(至少在4.1+):https://github.com/rails/rails/blob/master/activerecord/lib/active_record/enum.rb#L96-98,通过传递一个哈希表,例如:
class Foo
enum name: {
foo: 'myfoo',
bar: 'mybar'
}
尽管访问它时会出现意外结果,请参见https://github.com/rails/rails/issues/16459
foo_instance.foo!
foo_instance.name
=> "foo"
foo_instance[:name]
=> "myfoo"
更新
这个问题已在Rails 5修复,详情请参见https://github.com/rails/rails/commit/c51f9b61ce1e167f5f58f07441adcfa117694301。谢谢Yuri。
class Article < ApplicationRecord
enum status: [ :visible, :hidden ]
end
文章序列化器:
class ArticleSerializer < ActiveModel::Serializer
attributes :id, :status, :title, :body
end
{
"id": "1",
"type": "articles",
"attributes": {
"status": "visible",
"title": "Enums are passed as string in a json API render",
"body": "Great!",
}
class Foo < ApplicationRecord
NAMES = [
:foo,
:bar
]
enum names: NAMES.zip(NAMES).to_h
end