1

は、私は次のユーザーモデルとレールのアプリを持っている属性Truckモデルprimary_crew_member_idsecondary_crew_member_idが常に存在することを確認するために、Truckにはユーザー/クルーが存在できないという検証が行われています。私は何をすることができるようにしたいことは以下の通りですRailsのカスタム検証は

  • 私がする必要があることが検証に拡大
  • プライマリまたはセカンダリの乗組員(ユーザー)が他のトラックに割り当てられていないことを検証しますトラックAのJohn Doeがプライマリクルーのメンバーであるかどうかを確認してください。他のトラックのプライマリスロットまたはセカンダリスロットに割り当てることはできません。
  • さらにジョン・ドウが与えられたトラック(デュアルrostering)上のプライマリとセカンダリスロットの両方を取ることができないはず拡大

私はGoogleで検索してきたなど主要スロットを検証し、検証が出ていますそう:

検証:primary_multiple_assignment

def primary_multiple_assignment 
     if Truck.has_primary(primary_crew_member_id) 
     errors.add(:base, "User has already been assigned to another truck.") 
     end 
    end 

    def self.has_primary(primary_crew_member_id) 
     primary = Truck.where(primary_crew_member_id: primary_crew_member_id).first 
     !primary.nil? 
    end 

これが動作しているようですし、私は、ユーザーが単一のもの以外の任意のトラックに主スロットに割り当てられていないことを確認することができます。しかし、私は上記のように私の検証要件を満たすことができる必要があります。だから、基本的に私は1つの方法で複数の列を検証しようとしていますが、どのように動作するのか分かりません。

私はRailsのカスタム検証ガイドを読んだことがあります。あなたが助けなければならないかもしれないどんな情報も非常に高く評価されます。その間、私は解決策を見つけるためにつまずくとグーグルを続けます。

答えて

0

あなたは検証の2種類を使用してそれを行うことがあります。あなたの答えのための

# validate that the primary or secondary crew member (user) is not assigned to 
# any other truck 
validates :primary_crew_member, uniqueness: true 
validates :secondary_crew_member, uniqueness: true 

# validate that the primary crew member can't be secondary crew member on any 
# truck (including current one) 
validate :primary_not_to_be_secondary 

# validate that the secondary crew member can't be primary crew member on any  
# truck (including current one) 
validate :secondary_not_to_be_primary 

def primary_not_to_be_secondary 
    if Truck.where(secondary_crew_member_id: primary_crew_member_id).present? 
     errors.add(:base, "Primary crew member already assigned as secondary crew member.") 
    end 
end 

def secondary_not_to_be_primary 
    if Truck.where(primary_crew_member_id: secondary_crew_member_id).present? 
     errors.add(:base, "Secondary crew member already assigned as primary crew member.") 
    end 
end 
+0

おかげで、私はその後、私は考えていなかった、いくつかの異なるエッジケースを処理するので、私の独自のソリューションを作ってみました。すぐに私の答えを投稿します。 – nulltek