2

我正在关注本教程,该教程在 has_many :through 关系中表现出色。我有正常的事情,比如 category_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% 损坏)。我怎样才能做到这一点?

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

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

2 回答 2

2

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

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

于 2009-06-18T21:36:28.237 回答
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

那么你将不得不做一些愚蠢的getter,它结合了categories + categories_backwards,或者其他东西。

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

于 2009-06-18T23:18:50.120 回答