如何设置关联的 has_many 以查看数据库 table 中的 2 列(category_a_id 和 category_b_id)

How can I setup a has_many associated to look in 2 columns in a db table (category_a_id and category_b_id)

我需要能够 link 互相 categories

我有一个 category_links table 有 2 列 category_a_idcategory_b_id 来保存 2 个类别的 id linked.

我希望能够调用 Category.find(1).category_links,它将从 category_a_idcategory_b_id 列中抓取所有 ID 为 1 的记录。此外,如果一个类别被销毁,它将删除 category_link 数据库中的任何关联记录,如果它在 category_a_idcategory_b_id 列中关联。

我目前在 category_links 模型

belongs_to :category_b, :class_name => :Category
belongs_to :category_a, :class_name => :Category

并且在类别 db

has_many(:category_links, :foreign_key => :category_a_id, :dependent => :destroy)
has_many(:category_links, :foreign_key => :category_b_id, :dependent => :destroy)

但这只会将 category_b_id 列中的记录与匹配的 ID 关联起来,而不是同时关联两者。所以调用 Category.find(1).category_links 不会从 category_a_idcategory_b_id 中获取匹配的记录。销毁类别也是如此。

我怎样才能让它工作,如果我销毁一个类别,它会在两列中查找相关类别并调用 Category.find(1).category_links 也会在两列中查找匹配记录?

没有通过 has_many 实现这一点的简单方法,但如果您不必花哨,只需在 Category 上创建一个自定义方法即可:

def category_links
  @category_links ||= CategoryLinks.where('category_a_id = ? or category_b_id = ?', id, id)
end