我有以下型号:
class Conversation < ApplicationRecord
enum status: [ :active, :archived ]
belongs_to :person
end
class Person < ApplicationRecord
has_many :conversations
end
当我运行以下查询时,
@people = Person
.select('`user`.`name`, `conversations`.`status` AS conversation_status')
.joins(:conversations)
@people.map &:conversation_status
# => [1, 1, 0]
由于返回的记录是conversation_status
模型的实例,所以我得到了Person
的值未进行类型转换,但是enum
是在Conversation
上定义的。我想知道是否有一种方法可以手动键入强制转换enum
列的值。我可以执行以下操作以强制类型转换值:
@people.map do |person|
Conversation.statuses.find { |name, i| i == person.conversation_status }.first
end
# => ['archived', 'archived', 'active']
但是看起来有点尴尬。有官方/铁路/不太尴尬的方式到达那里吗?
深入研究源代码,我发现有一个ActiveRecord::Enum::EnumType
实例可以为我deserialize
赋值,但是我没有找到任何公开的方法来获取它。