How do I add migration with multiple references to the same model in one table? Ruby/Rails How do I add migration with multiple references to the same model in one table? Ruby/Rails ruby ruby

How do I add migration with multiple references to the same model in one table? Ruby/Rails


You can do this simply with the add_column method in your migrations and set up the proper associations in your classes:

class AddFields < ActiveRecord::Migration  def change    add_column :tickets, :image_1_id, :integer    add_column :tickets, :image_2_id, :integer  endendclass Ticket < ActiveRecord::Base  belongs_to :image_1, :class_name => "Image"  belongs_to :image_2, :class_name => "Image"endclass Image < ActiveRecord::Base  has_many :primary_tickets, :class_name => "Ticket", :foreign_key => "image_1_id"  has_many :secondary_tickets, :class_name => "Ticket", :foreign_key => "image_2_id"end

This blog post, Creating Multiple Associations with the Same Table, goes into more detail.


In Rails 5.1 or greater you can do it like this:

Migration

class AddFields < ActiveRecord::Migration   def change    change_table(:tickets) do |t|        t.references :image1, foreign_key: { to_table: 'images' }        t.references :image2, foreign_key: { to_table: 'images' }    end  endend

This will create the fields image1_id, and image2_id and make the database level references to the images table

Models

as in rossta's asnwer

class Ticket < ActiveRecord::Base  belongs_to :image_1, class_name: "Image"  belongs_to :image_2, class_name: "Image"endclass Image < ActiveRecord::Base  has_many :primary_tickets, class_name: "Ticket", foreign_key: "image_1_id"  has_many :secondary_tickets, class_name: "Ticket", foreign_key: "image_2_id"end

FactoryBot

If you uses FactoryBot then your factory might look something like this:

FactoryBot.define do  factory :ticket do    association :image1, factory: :image    association :image2, factory: :image  endend