2014-04-10 38 views
5

我嘗試了rails 4.1的新枚舉特性,並且遇到了一些麻煩。Rails 4.1枚舉:enum.status = nil

我的模型看起來是這樣的:

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" 

我不明白這一點...

+0

我有一個類似的問題:爲什麼我的枚舉值總是解決爲零? @ WillKoehler的回答訣竅。 – plusjeff

回答

12

我有同樣的問題。這是因爲枚舉字段在我的模式中被定義爲字符串而不是整數。在你的情況下,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 
0

此外,您可以繼續在模式中使用字符串,但這意味着您必須使用散列來顯式映射屬性和數據庫值之間的關係。 就像這樣;

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