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は使用されます