2016-12-14 7 views
1

私は最近、このコードに出くわしました。ユーザーには多くの回答があります。 class_nameと:foreign_keyの目的は何ですか?class_name foreign_key in Railsモデル

class Answer < ApplicationRecord 
    belongs_to :user, :class_name => 'Question", :foreign_key => 'question_id' 
end 

答えて

2

ここでの命名は、一種の奇妙ですが、:class_nameの目的は、Railsが期待するものとは異なるクラスを使用することができるようにすることです。モデルにbelongs_to :userがある場合、Railsは、それがUserという親クラスを指すことを期待しています。あなたの例では、RailsはUserクラスを探してスキップし、代わりにQuestionモデルを探します。

しかし、これの最も一般的な使い方は、デフォルト以外の関連付けの名前がデフォルトよりも意味を持つ場合です。だから、もっと良い例は、UserモデルとCompetitionモデルの場合です。各競技では1人のユーザーが優勝者になります。それぞれCompetitionUserに属していても、それは表現力豊かではありません。代わりに、あなたは関係が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

+0

移行でこれらの外部キーを作成する必要がありますか、モデルで十分に指定していますか? –

+1

@ JamesLowreyここでモデルに指定すると、ActiveRecordをルックアップでアシストするだけです。 DBが外部キーを適切に制約するようにするには、それを移行にも追加する必要があります。 –

関連する問題