如何使用 :through 选项声明 has_many 关联的特定键?

Posted

技术标签:

【中文标题】如何使用 :through 选项声明 has_many 关联的特定键?【英文标题】:How to declare a specific key for has_many association with :through option? 【发布时间】:2010-08-14 07:18:29 【问题描述】:

我有一个关联: 作者有很多书; 一本书有很多作者; 我需要使用 :through 选项(通过名为“relations”的表,有两列名为“left_id”(用作 author_id)和“right_id”(用于广告 book_id);


class Relation < ActiveRecord::Base
  belongs_to :books
  belongs_to :authors
end

class Author < ActiveRecord::Base
  has_many :relations, :foreign_key => 'left_id'
  has_many :books, :through => :relations
end

在控制台中:


> author = Author.new
> author.books 
#  => Error: no such column: relations.book_id

那么,我如何将 'book_id' 指定为 'right_id'?(是否有类似 'foreign_key' 的选项?)

【问题讨论】:

【参考方案1】:

您也应该在关系模型中使用foreign_key,因此belongs_to 也有foreign_key。更具体地说,这就是您所需要的:

class Relation < ActiveRecord::Base
  belongs_to :book, :foreign_key => :left_id
  belongs_to :author, :foreign_key => :right_id
end

其他模型应该是:

class Book < ActiveRecord::Base
  has_many :relations, :foreign_key => :left_id
  has_many :authors, :through => :relations
end


class Author < ActiveRecord::Base
  has_many :relations, :foreign_key => :right_id
  has_many :books, :through => :relations
end

【讨论】:

我冒昧地补充一点,将您的直通模型的名称作为对关系的有意义的描述可能是一个好习惯。考虑到书籍和作者的关系,作者身份是有意义的,尽管你可以永远追着你的尾巴,试图想出一些真正具有语义意义的东西。使用半描述性名称很有用,这样在以后维护代码时,该名称会自动为您提供一个上下文来评估它的职责。【参考方案2】:

我不知道foreign_id,也无法在谷歌上找到任何东西。这个怎么样?

has_many :relations, :local_key => 'left_id', :foreign_key => 'right_id'

【讨论】:

ArgumentError: Unknown key(s): local_key

以上是关于如何使用 :through 选项声明 has_many 关联的特定键?的主要内容,如果未能解决你的问题,请参考以下文章

记录:Unsatisfied dependency expressed through field ‘XxxService‘...亲测有效

连接数据报错ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql

如何在 Django 中使用 through 过滤 ManytoManyField?

有关如何使用has_many:through关系正确设置验证的指导?

django 模型:如何克服“通过”ManyToMany 选项限制

如何使用 Pass-through 查询从 MS Access 前端向 sql 表输入数据?