新手问题 升级 Rails 5 后,enum 的值从之前的 integer 变为了 string

teifuania · 2020年04月20日 · 最后由 teifuania 回复于 2020年04月20日 · 2765 次阅读

接手了一个 Rails 升级的项目。本人算是 Rails 小白。想请教大家 Rails 版本 4.2 --> 5.2 Ruby 2.3

我有一个 Recommendation model,其中包含和另一个 model WorkflowSate 的 association 代码如下

class Recommendation < ActiveRecord::Base

belongs_to :state, class_name: 'WorkflowState', foreign_key: :workflow_state_id
class WorkflowState < ApplicationRecord

WORKFLOW_STATES = ['DRAFT',
                     'PENDING_APPROVAL',
                     'APPROVED']

  def self.state_enums
    hash = {}
    WorkflowState.distinct.each do |state|
      hash[state.to_sym] = state.id
    end
    hash
  end

同时有一个 Recommendation 的 state machine

module RecommendationStateMachine
  # state setting
  def self.included(klass)
    klass.send(:include, AASM)

    klass.enum workflow_state_id: WorkflowState.state_enums

    # States
    klass.aasm column: :workflow_state_id, enum: true do
      state :draft, initial: true
      state :pending_approval
      state :approved

升级之前一切功能如常,rails console 中查看 Recommendation:

r = Recommendation.first
=> #<Recommendation id: 120463,  workflow_state_id: 3>

升级后查看 rails console

r = Recommendation.first
=> #<Recommendation id: 120463,  workflow_state_id: "apprvoed">

因为值的变化,导致 Recommendation 中的 belongs_to 找不到对应的 workflow state。所以 test 报错。 ROR 新手,有点摸不着头脑,不知道为什么会发生 enum 值发生变化的情况。求大佬帮助

https://ruby-china.org/topics/39489 参考我之前发的,也是升级过程中发现这个问题。

(enum_key_word)_before_type_cast

用这个方式就能取到之前对应的 Int

Catherine 回复

原来如此。非常感谢。可否再问一下,根据我的情况,我在 foreign key 里面引用这个 attribute,如果我想让这个 association 继续工作,是否需要新建一个 column 来增加 _before_type_cast 的值?还有更便捷的方法么?

Catherine 回复

改了一下对应的 primary key。暂时解决了问题!再次感谢!

teifuania 关闭了讨论。 04月20日 22:20
teifuania 关闭了讨论。 04月20日 22:20
需要 登录 后方可回复, 如果你还没有账号请 注册新账号