Rails 模型中的 class_nameforeign_key

Gun*_*ter 2 ruby activerecord ruby-on-rails-4

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

class Answer < ApplicationRecord
    belongs_to :user, :class_name => 'Question", :foreign_key => 'question_id'
end
Run Code Online (Sandbox Code Playgroud)

小智 7

这里的命名有点奇怪,但目的:class_name是允许您使用与 Rails 期望的不同的类。当模型上有 时belongs_to :user,Rails 会期望它指向名为 的父类User。在您的示例中,Rails 跳过查找User类,而是查找Question模型。

不过,最常见的用法是非默认关联名称比默认关联名称更有意义。因此,一个更合适的例子是,当您有一个User模型和Competition模型时,每个竞赛都有一个用户作为获胜者。您可以让每个都Competition属于 a 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
Run Code Online (Sandbox Code Playgroud)

这允许您将用户称为winners

competition = Competition.first
competition.winner
Run Code Online (Sandbox Code Playgroud)

这比你写的更具表现力competition.user