私は最近、このコードに出くわしました。ユーザーには多くの回答があります。 class_nameと:foreign_keyの目的は何ですか?class_name foreign_key in Railsモデル
class Answer < ApplicationRecord
belongs_to :user, :class_name => 'Question", :foreign_key => 'question_id'
end
私は最近、このコードに出くわしました。ユーザーには多くの回答があります。 class_nameと:foreign_keyの目的は何ですか?class_name foreign_key in Railsモデル
class Answer < ApplicationRecord
belongs_to :user, :class_name => 'Question", :foreign_key => 'question_id'
end
ここでの命名は、一種の奇妙ですが、:class_name
の目的は、Railsが期待するものとは異なるクラスを使用することができるようにすることです。モデルにbelongs_to :user
がある場合、Railsは、それがUser
という親クラスを指すことを期待しています。あなたの例では、RailsはUser
クラスを探してスキップし、代わりにQuestion
モデルを探します。
しかし、これの最も一般的な使い方は、デフォルト以外の関連付けの名前がデフォルトよりも意味を持つ場合です。だから、もっと良い例は、User
モデルとCompetition
モデルの場合です。各競技では1人のユーザーが優勝者になります。それぞれCompetition
がUser
に属していても、それは表現力豊かではありません。代わりに、あなたは関係がwinner
と呼ぶことにしたいことがあります。
class User < ActiveRecord::Base
has_many :winners, class_name: "Competition", foreign_key: "competition_id"
end
class Competition < ActiveRecord::Base
belongs_to :winner, class_name: "User", foreign_key: "winner_id"
end
これは、あなたがwinners
としてユーザーに参照することができます:
competition = Competition.first
competition.winner
これはあなたが書くした場合よりも多くの表現でありますcompetition.user
。
移行でこれらの外部キーを作成する必要がありますか、モデルで十分に指定していますか? –
@ JamesLowreyここでモデルに指定すると、ActiveRecordをルックアップでアシストするだけです。 DBが外部キーを適切に制約するようにするには、それを移行にも追加する必要があります。 –