Techioz Blog

Rails のスルーモデルに検証を追加する必要がありますか?

概要

class Product < ActiveRecord::Base
  has_many :collaborators
  has_many :users, :through => :collaborators
end

class User < ActiveRecord::Base
  has_many :collaborators
  has_many :products, :through => :collaborators
end

class Collaborator < ActiveRecord::Base
  belongs_to :product
  belongs_to :user
  validates :product_id, presence: true
  validates :user_id, presence: true
 end

スルーモデルの検証部分で問題が発生しています。 Userモデルから新しいレコードを作成するとき

User.create!(name: “ユーザー名”, product_ids: [1, 2, 3]) => Collaborator が有効であるというエラーが返されます。 ここでの問題は、validates:user_id, presents: true がこれをブロックすることです。この行をもう一度コメントすると、再び正常に動作し、Collaborator テーブルに作成された新しいレコードには user_id と product_id が残ります。

Rails6.1を使用しています

Rails のスルーモデルに検証を追加する必要がありますか?

解決策

Rails >= 5 では、belongs_to 表記により検証が自動的に追加されます。 6.1 ソースを参照

あなたのケースで検証が機能しない場合は、おそらく Rails.application.config.active_record.belongs_to_required_by_default を使用するでしょう。

grepしてみてください

git grep belongs_to -- config

デフォルトの設定を使用する方が良いと思います。ユーザーの存在を検証する必要が本当にない場合は、optional: true オプションを追加するだけです。

belongs_to :user, optional: true

それはビジネス ロジックによって異なりますが、インターネット上の誰かがそれを知っている可能性は低いです:)

いずれにせよ、アプリケーション層に列の存在を検証する場合は、データベース層に NOT NULL 制約を追加することをお勧めします。

ちなみに、Rails 5から始まる中間抽象モデルApplicationRecordは使用されます