23335
Ruby on Railsのモデルにおけるvalidationを実装したいと考えています。

下記の`Applicant`モデルの保存時に、`Applicant`モデルと関連する`Target`モデル内のカラムも参照して重複排除したいと考えています。  
1つのモデル内であれば、scopeを用いることで複数のカラムを参照した重複排除は可能だと思いますが、別モデルの値も参照した重複排除にするにはどうするのが良いか、伺えればと思います。

下記詳細となります。

* * *

# モデルの構成

[Event] --1:多-- [Target] --1:多-- [Applicant] --多:1-- [User]

* * *

# モデル：Applicant

```

    class Applicant < ActiveRecord::Base
      belongs_to :target
      belongs_to :user
      has_one :event, through: :target
      # ここで、Applicantのカラム「user_id」とTargetのカラム「event_id」で
      # 重複をチエックしたいと考えています。
    end
    
```

Applicantモデルのカラム：user_id,target_id,name等

* * *

# モデル：Target

```

    class Target < ActiveRecord::Base
      belongs_to :event
      has_many :applicants
    end
    
```

Targetモデルのカラム：event_id,name等

* * *

# モデル：Event

```

    class Event < ActiveRecord::Base
      has_many :targets
      has_many :applicants, through: :targets
    end
    
```

Eventモデルのカラム：name等

* * *

もしくは、上記のようなものを実装したいのであれば、  
`Applicant`モデルに「event_id」カラムを追加する方がよろしいでしょうか。

よろしくお願い致します。
CC BY-SA 3.0
2016-03-18T07:23:47.353
23247
2021-05-05T00:52:01.050
2021-05-05T00:52:01.050
19110
12734
question
ruby-on-rails ruby rails-activerecord バリデーション
モデルのvalidation時に、関連のある別モデルも参照するやり方
標準のバリデータでは検証できないと思うので、カスタムバリデータを実装することになります。

```

    class Model < ActiveRecord::Base
      validate :custom_validate
    
      def custom_validate
        # 検証に失敗した場合
        errors.add(:column_name, "メッセージ")
      end
    
```

が、この例であれば、`Applicant`に`event_id`を持たせたほうが良いと思います。

関連先の値で検証を行う場合、カスタムバリデータの実装と関連先のモデルの作り方や作る順番に注意しないと、意図せず検証を通過してしまうことがあります。
CC BY-SA 3.0
2016-03-22T04:42:39.053
23335
2016-03-22T04:42:39.053
5793
23247
answer