在ActiveRecord上,为什么在被引用的模型上定义foreign_key而不是使用它的模型?

时间:2014-03-22 21:53:39

标签: ruby-on-rails activerecord

这可能是一个超级新手问题。很长一段时间以来,我一直是一个快乐的铁路用户,但对此非常困惑:

为什么我们需要在被引用的模型上指定foreign_key属性,而不是在实际引用它的模型上?例如,为什么我们这样做:

class User < ActiveRecord::Base
  has_many :posts, :foreign_key => author_id

class Post < ActiveRecord::Base
  belongs_to :user

而不是

class User < ActiveRecord::Base
  has_many :posts

class Post < ActiveRecord::Base
  belongs_to :user, :foreign_key => author_id

也许我错过了一些东西,但我认为如果将foreign_key定义为belongs_to的参数会更有意义,因为Post表是在数据库中定义author_id的地方。有人能解释一下吗谢谢

[UPDATE] 也许问题很混乱。让我澄清一下:我已经知道当我需要使用foreign_key属性时,我在这个特定的例子中询问了在User模型而不是Post上具有该属性的ActiveRecord约定。

2 个答案:

答案 0 :(得分:1)

它与rails如何为has_many关系生成查询有关。包含foreign_key属性告诉rails在查找相关帖子时使用该列

SELECT posts.* FROM posts WHERE posts.author_id = self.id

如果缺少该标志,它将回退到以下惯例

SELECT posts.* FROM posts WHERE posts.user_id = self.id

您始终可以通过调用.to_sql方法检查生成的sql以查找active_record查询

user.posts.to_sql

答案 1 :(得分:0)

只有当连接表中的密钥(在迁移文件中)具有其他名称时,才应指定自定义fk。