这可能是一个超级新手问题。很长一段时间以来,我一直是一个快乐的铁路用户,但对此非常困惑:
为什么我们需要在被引用的模型上指定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约定。
答案 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。