我有一个用户模型,有两个自我加入,卖家和买家。
我有一个类别模型,一个卖家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
答案 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
我知道可能需要进行一些您没有预料到的变化,但在这样做时,您会获得更自然的方法,例如:
在引擎盖下,您的联接表将包含以下列:
运行迁移:
用户不需要一个,它不是模特。
买家和卖家非常简单,老用户模型+买家/卖家模型。
类别不需要,因为它已经存在。
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