2016-10-13 27 views
1

チャレンジのカテゴリがhabitの場合にのみcommittedのプレゼンスが真である必要がある場合、どのように検証を行うことができますか?シリアライズされた配列の条件付きバリデーション

class Challenge < ActiveRecord::Base 
    CATEGORY = ['goal', 'habit'] 
    serialize :committed, Array 
    validates :committed, presence: true, if: :habit # I also tried with 'habit' & 'Habit' 
end 
+0

カテゴリはどこに保存されていますか?それは列ですか、別の表にありますか? – Nobita

+0

チャレンジテーブルの 't.string"カテゴリ "@Nobita –

答えて

2

あなたのカテゴリが'habit'(ノート、それは'Habit'ではありません)と呼ばれているので、以下のように、検証がなります

追記として
validates :committed, presence: true, if: ->(c) { c.category == 'habit' } 

:私はあなたのスコープとは思いませんchallengesテーブルにcategoriesという列がない場合は、コメント欄での議論を1として

scope :habit, -> { where(category: 'habit') } 

EDIT

、あなたはcommittednilの代わりになりたい場合は: あなたの意図はカテゴリー'habit'を持っている課題を、選択した場合は、次のようにこのように、スコープが見えます[""]何もない、カスタム検証を追加します。

validate :committed_content 

private 

def committed_content 
    self.committed = nil if committed.empty? || committed.all?(&:blank?) 
    true 
end 
+0

ああ、良い点。私はそれがそれの一部だと思ったので、私はそれを取るだろうが、私はそうは思わない。私はエラーが発生しましたが、 '構文エラー、予期しない ' ... trueの場合: - >(c){c.category&。== 'habit'} ' –

+0

@ AnthonyGalli.comああ、あなたはRuby <= 2.3かもしれない。これを試してください: 'validates:committed、presence:true、if :->(c){c.category == 'habit'}' –

+0

@ AnthonyGalli.comはうまくいきましたか? –

2
validates :committed, presence: true, :if => lambda { |c| c.category == 'Habit' } 
+0

の列です。エラーを返します:' syntax error、unexpected => ...コミット、存在:true、if => lambda {| c | ccategories == ... ... \ ' –

+0

@ AnthonyGalli.comシンボルがあるかどうかを確認します回答を更新しました – dnsh

+0

ありがとうございます。しかし、今は'初期化されていない定数ActiveSupport :: Callbacks :: Callback :: Habit' –

1

あなたがメソッドを持っており、このようにそれを使用することができます:

validates :committed, presence: true, if: :habit? 

def habit? 
    self.category == 'habit' 
end 
関連する問題