2017-12-30 45 views
0

Rails ActiveRecordには、belongs_tooptionalオプションがあります。外部キーにnullを許可し、オブジェクトの作成中に関連付けをnullにするが、後続の保存ではその存在を要求するというユースケースを考えてみてください。たとえば、新しいメンバーには最初のグループはないかもしれませんが、それ以上のメンバーの更新にはグループの関連付けが必要です。ActiveRecord belongs_to関連付けのオプション条件をどのように宣言しますか?

optionalオプション値自体を条件付きにすることはできますか?例えば、

class Member < ApplicationRecord 
    belongs_to :group, optional: -> { new_record? } 
end 

optional: trueと同じように動作し、我々はoptionalオプションがtruthy値のためにのみチェックを解析することを推測することができます。

カスタムバリデーターは、このユースケースを満たすための現実的な方法ですか?

答えて

1

optionalオプションにラムダを指定すると動作しません(私は試していませんが)。私はsource codeを見て、これはoptionalの使い方です。

required = !reflection.options[:optional] 

必要な場合は、Railsはちょうどこのような存在の検証を追加します。確かに

class Member < ApplicationRecord 
    belongs_to :group, optional: true 
    validates :group, presence: true, on: :update 
end 
+0

model.validates_presence_of reflection.name, message: :required 

私はあなたがこのようなものでカスタムルートを行くことができると信じています。ソースを引用していただきありがとうございます。 – ybakos

0

あなたはビジネスロジックを記述しているデータベース制約を記述していません。条件を適用するためのバリデータを追加します。

validates :group, presence: true, on: :update 

これは、更新時にのみ条件を強制的に適用し、作成時には適用しません。

関連する問題