Habtm为具有自联接的模型连接表

时间:2016-01-12 17:12:46

标签: ruby-on-rails database ruby-on-rails-4 join

以下是previous question

我有一个用户模型,有两个自我加入,卖家和买家。

我有一个类别模型,一个卖家has_and_belongs_to_many类别,买家也是如此。 如何创建迁移,以便我可以执行seller.categories和categories.buyers等...

我认为它会像我下面的那样,但它不起作用......

def change
    create_table :categories_sellers do |t|
      t.references :category
      t.references :user
    end
    add_foreign_key :categories_sellers, :users, column: :trainer_id
    add_index :categories_users, [:category_id, :seller_id]
    add_index :categories_users, :seller_id
    end
  end

1 个答案:

答案 0 :(得分:0)

要回答你的问题,看起来你只需要改变t.references:user to t.references:seller。

那就是说,我强烈建议您对项目进行建模:

module User
  extend ActiveSupport::Concern

  has_many :category_users, as: :user
  has_many :categories, through: :category_users

  # include any common methods for buyers and sellers, 
  # basically your current User model
end

class Buyer < ActiveRecord::Base
  include User
end

class Seller < ActiveRecord::Base
  include User
end

class CategoryUser < ActiveRecord::Base
  belongs_to :category
  belongs_to :user, polymorphic: true
end

class Category < ActiveRecord::Base
  has_many :category_users
  has_many :buyers, through: :category_users, source: :user, source_type: 'Buyer'
  has_many :sellers, through: :category_users, source: :user, source_type: 'Seller'
end

我知道可能需要进行一些您没有预料到的变化,但在这样做时,您会获得更自然的方法,例如:

  • category.buyers
  • category.sellers
  • buyer.categories
  • seller.categories

在引擎盖下,您的联接表将包含以下列:

  • id - 行ID
  • category_id - 类别ID,当然
  • user_id - 买方或卖方的ID
  • user_type - &#34;买方&#34;之一或&#34;卖方&#34; (或您认为的任何其他类型&#34;用户&#34;)

运行迁移:

用户不需要一个,它不是模特。

买家和卖家非常简单,老用户模型+买家/卖家模型。

类别不需要,因为它已经存在。

CategoryUser:

def change
  create_table :category_users do |t|
    t.references :category
    t.references :user, polymorphic: true
  end
  add_index :category_users, :category_id
  add_index :category_users, [:category_id, :user_id]
  add_index :category_users, [:category_id, :user_id, :user_type]
end

我还没有亲自检查过,但应该是正确的,或者是关闭的。然而,总体原则是利用多态关联在某些用户之间建立更自然的关联。 (无论是买方,卖方还是您提出的任何其他类型的用户)和类别。然后,你不需要一遍又一遍地复制相同类型的关联,因为模型略有不同。

以下是有关此方法的更多详细信息:

http://guides.rubyonrails.org/association_basics.html#polymorphic-associations