2017-06-19 16 views
0

私はそうのようenumを定義するモデルを有しています。ActiveRecordの列挙及びダーティ属性

タイムスタンプの更新や電子メールの送信など、これに依存するモデルコールバックがたくさんあります。

しかし、残念ながらこれはどれも動作しません。

sh = Shipment.find(1) 
sh.init? 
=> true 
sh.requested! 
sh.requested? 
=> true 
sh.shipment_requested 
=> false 

上記のコードにはどのような問題がありますか?これはバグですか?

私はコントローラに手動ですべての値を設定することができたが、これは上記のドキュメントごとにかなり素晴らしい機能が付属して列挙型を使用しての目的に反し、status

+0

「status_changed?」とは何ですか? – Pavan

+1

[AASM](https://github.com/aasm/aasm)は、このような場合に適しています。 – 31piy

+1

@Pavan [rails dirty属性](http://api.rubyonrails.org/classes/ActiveModel/Dirty.html) – static

答えて

2

てみてくださいを確認するためにスコープとメソッドを定義するような値を文字列としてchanged?に送信する方法:

class Entry < ApplicationRecord 
    enum type: [:single, :double, :triple] 
end 

e = Entry.first 
e.type # => "single" 
e.type = :double 
# notice here values are strings, not symbols 
e.type_change # => ["single", "double"] 
e.type_changed?(from: :single, to: :double) # => false 
e.type_changed?(from: "single", to: "double") # => true 
+0

ありがとう!モデルの汚れた属性メソッドの中で文字列リテラルをハードコーディングするのを避ける方法はありますか? – static

+0

さて、私はこれを逃したのですか? :) 良いですね! – Pavan

+1

@static新しい値の文字列を削除する方法しか知りません: 'e.type_was ==" single "&& e.double?' –

関連する問題