Rails模型中的class_name foreign_key

时间:2016-12-14 00:37:34

标签: ruby ruby-on-rails-4 activerecord

我最近遇到过这段代码。用户有很多答案。 :class_name和:foreign_key的目的是什么?

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

1 个答案:

答案 0 :(得分: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更具表现力。