2016-12-14 63 views
1

我最近遇到這段代碼。用戶有很多答案。 :class_name和:foreign_key的用途是什麼?class_name foreign_key in Rails model

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模型,其中每個競賽有一個用戶作爲勝利者。你可以讓每個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

+0

您是否需要在遷移中創建這些外鍵,或者是否足夠在模型中指定它們? –

+1

@JamesLowrey在模型中指定它們只是幫助ActiveRecord進行查找。如果您希望數據庫正確限制外鍵,則還需要將其添加到遷移中。 –