2016-12-14 44 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进行查找。如果您希望数据库正确限制外键,则还需要将其添加到迁移中。 –