34

同じテーブルを参照する2つのフィールドを使用して移行を作成するにはどうすればよいですか?テーブルAと画像があります。A.image1_idは画像を参照し、A.image2_idも画像を参照します。画像は2つしかなく、多くはありません。使用する場合

class AddFields < ActiveRecord::Migration
   def change
    change_table(:ticket) do |t|
        t.references :image1_id
        t.references :image2_id
    end
  end
end

最後に別の_idが追加され、おそらく「image」モデルを使用することを知らないため、これは機能しないと思います。私も考えました

change_table(:ticket) do |t|
    t.references :image

しかし、どうすればそれらのうちの2つを追加できますか?追加することも考えました

create_table :images do |t|
  t.belongs_to :ticket
  t.string :file

しかし、私は2つだけが必要で、多くはありません。これでは、またはのように、チケットから画像にアクセスできないようticket.image1ですticket.image2

このドキュメントhttp://apidock.com/rails/v3.2.8/ActiveRecord/ConnectionAdapters/SchemaStatements/change_tableによると、私が見つけたのはこれだけで、t.referencesも引数を取っていないようです。

change_table(:suppliers) do |t|
  t.references :company
end
4

2 に答える 2

45

これは、移行のメソッドを使用して簡単に行うことができadd_column、クラスに適切な関連付けを設定できます。

class AddFields < ActiveRecord::Migration
  def change
    add_column :tickets, :image_1_id, :integer
    add_column :tickets, :image_2_id, :integer
  end
end

class Ticket < ActiveRecord::Base
  belongs_to :image_1, :class_name => "Image"
  belongs_to :image_2, :class_name => "Image"
end

class 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

このブログ投稿「同じテーブルで複数の関連付けを作成する」では、さらに詳しく説明します。

于 2013-02-14T05:18:27.437 に答える
22

Rails 5.1以降では、次のように実行できます。

移行

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
  end
end

これにより、フィールドが作成さimage1_idimage2_id、データベースレベルでimagesテーブルが参照されます。

モデル

rosstaのasnwerのよう

class Ticket < ActiveRecord::Base
  belongs_to :image_1, class_name: "Image"
  belongs_to :image_2, class_name: "Image"
end

class 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

FactoryBotを使用する場合、ファクトリは次のようになります。

FactoryBot.define do
  factory :ticket do
    association :image1, factory: :image
    association :image2, factory: :image
  end
end
于 2019-08-02T08:02:57.780 に答える