使用ActiveRecord的多对多关联到同一模型?

时间:2009-06-18 20:55:45

标签: ruby-on-rails activerecord many-to-many

我正在关注this tutorial,这对于has_many来说非常出色:通过关系。我有类似product_product工作的正常事情。

但是,我无法概念化这种情况(也无法使其发挥作用):我有一个具有相关类别的类别。因为每个类别都可以有N个类别......首先,这实际上是多对多的情况(我是非常积极的)?其次,这会是什么样子?我的迁移看起来像这样:

create_table :categories do |t|
  t.string :name
  t.timestamps
end

create_table :related_categories, :id => false do |t|
  t.integer :category_a_id
  t.integer :category_b_id
end

我的模特胆量

has_many :related_categories, :foreign_key=>"category_a_id"
has_many :categories, :through => :related_categories, :source=>:category_a

这显然是不对的,虽然它已经到了那里(即它已经100%被打破)。我怎么能这样做?

编辑:我忘记了这一点,但只是在这里SO(意味着它不是答案):

class RelatedCategory < ActiveRecord::Base
  belongs_to :category_a, :class_name=>"Category"
  belongs_to :category_b, :class_name=>"Category"
end

2 个答案:

答案 0 :(得分:2)

您应该在has_many声明中尝试:source => :category_b

您已使用category_a_id作为相关类别表的外键。这基本上告诉ActiveRecord在获取与其相关的所有related_categories记录时,将category_a_id表上的related_categories字段与当前的Category对象ID进行匹配。此has_many :through声明的source参数指定在填充类别集合时应考虑将哪个字段用于查找(或写入)相关对象。

答案 1 :(得分:0)

这是答案,但它并不漂亮。

  has_many :related_categories, :foreign_key=>"category_a_id"
  has_many :related_categories2, :class_name=>"RelatedCategory", :foreign_key=>"category_b_id"
  has_many :categories, :through => :related_categories, :source=>:category_b
  has_many :categories_backwards, :through => :related_categories2, :source=>:category_a
  has_many :category_products

然后你必须做一些结合了类别+ categories_backwards或其他东西的傻瓜。

编辑[2分钟后]:哇,有了吸气剂,它几乎看起来很完美!当然,问题是你必须推送到类别,而不是从getter获得的任何内容。