【问题标题】:Rails 4.1 Enums: enum.status = nilRails 4.1 枚举:enum.status = nil
【发布时间】:2014-04-10 08:57:11
【问题描述】:

我尝试了rails 4.1的新枚举功能,但遇到了一些麻烦。

我的模型如下所示:

class Report < ActiveRecord::Base
  after_save :notify_clients
  before_update :update_progress
  before_create do
    self.status ||= 'started'
  end

  enum status: %w{started active fail success}

  #...
end

如果我尝试在我的视图中这样使用它:

.item{class: @report.status, data: {id: @report.id}}

我会在我的浏览器中看到这个

<div class="item" data-id="25">

我试图找出 status 实际使用的 rails console

  [11] pry(main)> Report.all.sample.status
    Report Load (0.3ms)  SELECT `reports`.* FROM `reports`
  => nil
  [12] pry(main)> Report.all.sample.status
    Report Load (0.2ms)  SELECT `reports`.* FROM `reports`
  => nil
  [13] pry(main)> Report.all.sample.status
    Report Load (0.3ms)  SELECT `reports`.* FROM `reports`
  => nil
  [14] pry(main)> Report.all.sample.status
    Report Load (0.2ms)  SELECT `reports`.* FROM `reports`
  => nil

现在看看这个:

 [22] pry(main)> Report.all.sample.attributes['status']
    Report Load (0.2ms)  SELECT `reports`.* FROM `reports`
  => "3"

我不明白...

【问题讨论】:

  • 我有一个类似的问题:为什么我的枚举值总是被解析为 nil? @WillKoehler 的回答成功了。

标签: activerecord enums ruby-on-rails-4.1


【解决方案1】:

我遇到了同样的问题。这是因为枚举字段在我的架构中被定义为字符串而不是整数。在您的情况下,status 可能在您的架构中定义为字符串。

class CreateReport < ActiveRecord::Migration
  def change
    create_table :reports do |t|
      ...
      t.integer :status     # if this is t.string you get the symptoms described above!
      ...
    end
  end
end

【讨论】:

    【解决方案2】:

    您也可以继续在架构中使用字符串,但这意味着您必须使用哈希显式映射属性和数据库值之间的关系。 像这样的东西;

    enum status: { started: 'START', active: 'ACT', fail: 'FAIL', success: 'SUCC'}
    

    【讨论】:

    • 我已经遵循了这个模式,但是我如何让它在视图中可用。这就是我现在所拥有的:`
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-02-08
    • 2014-07-04
    • 1970-01-01
    • 2014-06-18
    • 2014-05-22
    • 2011-12-12
    相关资源
    最近更新 更多