2013-09-07 8 views
6

私の質問は簡単ですが、私は明確な答えを見つけることができませんでした。belongs_to/has_many関係の移行でadd_indexを使用する必要がありますか? (Rails 3.2、Active Record)

私は毎日お得なRailsアプリをビルドします。

  • 各取引は各製品はRails Guidesから契約2.3をFolowing

に属している多くの製品(has_manyの)

  • を持って、私は私の移行でこれを使用します:

    class CreateDeal < ActiveRecord::Migration 
        def change 
         create_table :deals do |t| 
         t.string :name 
         t.timestamps 
         end 
    
         create_table :products do |t| 
         t.belongs_to :Deal 
         t.timestamps 
         end 
        end 
        end 
    

    Rails/activeレコードは自動的にProduct Tableに追加されます。ac olumn deals_idは正しいですか?

    マイ・マイグレーションadd_indexを追加することによって、この「deals_id」列に手動で索引を追加する必要がありますか(または後述のように)、私が設定したbelongs_to/has_many関係のため「自動」ですか?

    create_table :products do |t| 
        t.belongs_to :Deal 
        t.timestamps 
    
        add_index :products, :deals_id 
    end 
    
  • +0

    't.belongs_to:Deal'は' t.belongs_to:deal'となるべきではありません –

    答えて

    12

    あたりとして

    class CreateDeal < ActiveRecord::Migration 
        def change 
        create_table :deals do |t| 
         t.string :name 
         t.timestamps 
        end 
    
        create_table :products do |t| 
         t.string :title 
         t.timestamps 
        end 
    
        create_table :deals_products do |t| 
         t.belongs_to :deal 
         t.belongs_to :product 
        end 
        end 
    end 
    

    あなたが使用する場合は、しかし...インデックスを自分で追加する必要がありますモデルのコマンドラインジェネレータを使用してbelongs_toを使用すると、Railsはインデックスにマイグレーションを追加します。

    それだけで明示的にあなたが何を考えて作成するのが最善と思われる:

    rails g model product deal:belongs_to 
    

    は、あなたが何かを作成または作成されていないされているかどうかわからない、このような疑問の状況では、

    class CreateProducts < ActiveRecord::Migration 
        def change 
        create table :products do |t| 
         t.belongs_to :deal 
    
         t.timestamps 
        end 
        add_index :products, :deal_id 
        end 
    end 
    
    2

    自分でインデックスを追加する必要があります。

    また、あなたの移行を使用すると、すなわち第三のテーブルを必要とする、非常に適切ではありません。http://guides.rubyonrails.org/association_basics.html#the-has-and-belongs-to-many-association

    +0

    これは多対多の関係の設定です。マチューが話している単純なhas_many関係ではありません。この設定では、2つのテーブルと1つのインデックスの代わりに2つのインデックス(この移行から除外された)が必要なテーブルがあるため、多対多の関連付けが本当に必要でない限り、この設定を個人的に避けます。 インデックスが高速化されている間は、保存/更新処理に時間がかかりますので、オーバーヘッドを削減する必要がある場合に限り、その使用を最小限に抑える方が一般的です。この場合、1つの索引で十分であるようです。 – makewavesnotwar

    +0

    ええ、私の間違い - 私はどこから多対多を使用していたのか分かりません。 – veritas1

    1

    マチューを生成します(この場合はインデックス)が必要で、移行を実行するときに何が起こるかを確認してください。

    :deal_id列がすでに索引付けされていて、その索引を再索引付けしようとすると、エラーが発生し、移行がロールバックされて修正できるようになります。ただし、移行でインデックスを追加しなかった場合は、明らかにエラーは発生しませんが、インデックスが存在するかどうかを確認するために追加の手順を踏む必要があります。

    class CreateDeal < ActiveRecord::Migration 
        def change 
        create_table :deals do |t| 
         t.string :name 
         t.timestamps 
        end 
    
        create_table :products do |t| 
         t.belongs_to :Deal 
         t.timestamps 
        end 
    
        add_index :products, :deal_id 
        end 
    end 
    

    テーブルの作成処理が完了した後でも、インデックスを追加することに注意してください。 create_tableヘルパー内でadd_indexヘルパーを使用すると、おそらくエラーが発生します。

    関連する問題