Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
915 views
in Technique[技术] by (71.8m points)

ruby on rails - Same Model for Two belongs_to Associations migration

How do I create a migration for a model that has two references to the same model.

I have a user model with two roles, buyer and seller, I also have a sales model so each sale should have one buyer and one seller.

I've seen this answer that would suggest my sales model should look like

class Sale < ActiveRecord::Base
  belongs_to :buyer, :class_name => 'User', :foreign_key => 'buyer_id'
  belongs_to :seller, :class_name => 'User', :foreign_key => 'seller_id'
end

but I don't know how to create the migration and get it to work...!

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

You have to create the following migration:

rails g migration AddBuyerAndSellerToSales buyer:references seller:references

This should create the following migration file:

class AddBuyerAndSellerToSales < ActiveRecord::Migration
  def change
    add_reference :sales, :buyer, index: true, foreign_key: true
    add_reference :sales, :seller, index: true, foreign_key: true
  end
end

If you use a database engine like PostgreSQL you have to tell the engine to which table the foreign key will point.

class AddBuyerAndSellerToSales < ActiveRecord::Migration
  def change
    add_reference :sales, :buyer, index: true   # foreign_key: true <= remove this!
    add_reference :sales, :seller, index: true  # foreign_key: true <= remove this!

    add_foreign_key :sales, :users, column: :buyer_id
    add_foreign_key :sales, :users, column: :seller_id
  end
end

Hope this helps!


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...