2013-09-07 11 views
6

Moje pytanie jest dość proste, ale nie udało mi się znaleźć jasnej odpowiedzi.Potrzebujesz użyć add_index podczas migracji dla związku belongs_to/has_many? (Rails 3.2, Active Record)

Buduję codzienną aplikację Railsy.

  • Każda sprawa ma wiele produktów (has_many)

  • Każdy produkt należący do czynienia

folowing 2.3 z Rails Guides, użyję tego w moim migracji:

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 

Automatycznie, szyny/aktywne rekordy zostaną dodane do tabeli produktów ac oliwa deals_id right?

Czy muszę dodać indeks do tej kolumny relations_id ręcznie (jak poniżej), dodając do mojej migracji add_index lub czy jest to "automatycznie" z powodu ustawionej przeze mnie relacji belongs_to/has_many?

create_table :products do |t| 
    t.belongs_to :Deal 
    t.timestamps 

    add_index :products, :deals_id 
end 
+0

nie powinien 't.belongs_to: Deal' być' t.belongs_to: deal' –

Odpowiedz

12

Trzeba dodać indeks siebie ... Jednakże, jeśli używasz generator linii poleceń dla modelu i użyj belongs_to, Railsy dodają indeks do migracji ...

np.

rails g model product deal:belongs_to 

przyniosłoby

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

Musisz sam dodać indeksowanie.

także migracja nie jest całkiem w porządku, trzeba 3rd tabeli IE:

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 

zgodnie http://guides.rubyonrails.org/association_basics.html#the-has-and-belongs-to-many-association

+0

Jest to konfiguracja dla relacji wielu do wielu, a nie dla prostej relacji ma wiele Mathieu. Osobiście unikam tej konfiguracji, chyba że naprawdę potrzebujesz skojarzenia wiele do wielu, ponieważ przy tej konfiguracji masz 3 tabele wymagające 2 indeksów (które zostały pominięte w tej migracji) zamiast 2 tabel i jednego indeksu. Jak rozumiem, podczas gdy prędkość aż wskaźnik zapytań, one zaoszczędzić procesy/aktualizacyjne trwać dłużej, więc jesteś ogólnie lepiej minimalizując ich zastosowanie tylko, gdy trzeba je zmniejszyć obciążenie. W tym przypadku wydaje się, że jeden indeks powinien wystarczyć. – makewavesnotwar

+0

Tak, mój błąd - nie wiem, skąd wziąłem, że korzystał z wielu do wielu. – veritas1

1

Mathieu, w sytuacjach wątpliwych jak ta, w której nie jesteś pewien, czy coś jest tworzony lub nie stworzył: Najlepszym rozwiązaniem wydaje się po prostu jawnie tworzyć to, co myślisz jest potrzebny (w tym przypadku indeks) i zobacz, co się stanie, gdy uruchomisz migrację.

Logika tego jest taka, że ​​jeśli twoja kolumna :deal_id jest już zaindeksowana, a twoja migracja spróbuje ponownie ją zindeksować, pojawi się błąd i migracja zostanie wycofana, abyś mógł to naprawić. Jeśli jednak nie dodasz indeksu do migracji, nie dostaniesz żadnych błędów, ale musisz wykonać dodatkowy krok, aby sprawdzić, czy indeks istnieje.

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 

Należy również dodać indeks po zakończeniu procesu tworzenia tabeli. Używanie pomocnika add_index wewnątrz pomocnika create_table prawdopodobnie spowoduje błąd.

Powiązane problemy