在Rails上递归多对多的关系

时间:2015-01-05 12:29:09

标签: mysql ruby-on-rails ruby

对于我的项目,我有一些帖子链接到类别。我想要实现的目标是拥有与他人相关的类别。像这样:

c1 = Category.create(name: 'Television')
c2 = Category.create(name: 'TV')

c1.relatives << c1

我使用连接表:

create_table :category_relative, id: false do |t|
  t.belongs_to :category_1
  t.belongs_to :category_2
end

add_index :category_relative, [:category_1_id, :category_2_id]

到目前为止,我已经尝试过这个:

class Category < ActiveRecord::Base
    has_and_belongs_to_many :relatives, class_name: 'Category',
                      join_table: 'category_relative', foreign_key: 'category_1_id',
                      association_foreign_key: 'category_2_id'
end

这是有效的,但只有一个方面:

c1.relatives
=> []
c2.relatives
=> [#<Category:0x007fcc610b8418 id: 1, name: 'Television']

我知道我可以为每个条目添加一个亲戚,但这对我的数据库来说太重了:

c1.relatives << c2
c2.relatives << c1
你知道吗?我应该手动编写JOIN吗?

1 个答案:

答案 0 :(得分:0)

您可以尝试这样的事情

class Category < ActiveRecord::Base
    has_many :category_relatives, dependent: :destroy
    has_many :relatives, :through => :category_relative
    has_many :inverse_category_relatives, :class_name => "categoryRelative", :foreign_key => "category_2_id", dependent: :destroy
    has_many :inverse_relatives, :through => :inverse_category_relative, :source => :category
end

通过课程:

class CategoryRelative < ActiveRecord::Base
    belongs_to :category
    belongs_to :relative, :class_name => "Category"
end

使用此代码,您可以在同一个类之间建立多对多的关系