2013-09-07 51 views
6

Câu hỏi của tôi khá đơn giản nhưng tôi không tìm được câu trả lời rõ ràng.Cần sử dụng add_index khi di chuyển cho mối quan hệ thuộc_to/has_many? (Rails 3.2, Active Record)

Tôi tạo ứng dụng Rails giao dịch hàng ngày.

  • Mỗi thỏa thuận có nhiều sản phẩm (has_many)

  • Mỗi sản phẩm thuộc về một thỏa thuận

Sau sự 2.3 từ Rails Guides, tôi sẽ sử dụng này trong việc di chuyển của tôi:

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 

Tự động, bản ghi Rails/hoạt động sẽ thêm vào Bảng sản phẩm ac olumn deals_id phải không?

Tôi có cần phải thêm chỉ mục trên cột deals_id này theo cách thủ công (như dưới đây) hay không bằng cách thêm vào di chuyển add_index hoặc được thực hiện "tự động" vì mối quan hệ thuộc_to/has_many mà tôi đã đặt?

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

    add_index :products, :deals_id 
end 
+0

không nên 't.belongs_to: Thỏa thuận' là' t.belongs_to: deal' –

Trả lời

12

Bạn cần thêm các chỉ số chính mình ... Tuy nhiên, nếu bạn sử dụng trình tạo dòng lệnh cho mô hình và sử dụng attribute_to, Rails sẽ thêm vào chỉ mục vào quá trình di chuyển ...

ví dụ

rails g model product deal:belongs_to 

sẽ tạo ra

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

Bạn sẽ cần tự thêm chỉ mục.

Cũng chuyển đổi của bạn là không hoàn toàn đúng, bạn cần một ví dụ bảng 3:

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 

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

+0

Đây là thiết lập cho mối quan hệ nhiều-nhiều, chứ không phải mối quan hệ has_many đơn giản Mathieu đang nói đến. Cá nhân tôi sẽ tránh thiết lập này trừ khi bạn thực sự cần một liên kết nhiều thành viên bởi vì với thiết lập này, bạn có 3 bảng yêu cầu 2 chỉ mục (được bỏ ra khỏi quá trình di chuyển này) thay vì 2 bảng và một chỉ mục. Như tôi đã hiểu, trong khi chỉ số tăng tốc truy vấn, chúng làm cho quá trình lưu/cập nhật mất nhiều thời gian hơn, do đó, bạn nên giảm thiểu việc sử dụng chúng chỉ khi bạn cần chúng để giảm chi phí. Trong trường hợp này, có vẻ như một chỉ mục là đủ. – makewavesnotwar

+0

Vâng, sai lầm của tôi - tôi không biết tôi đã nhận ra rằng anh ta đang sử dụng nhiều từ nhiều đến đâu. – veritas1

1

Mathieu, trong những tình huống nghi ngờ như thế này, nơi bạn không chắc chắn nếu có điều gì đang được tạo ra hoặc không được tạo ra: nó có vẻ tốt nhất để tạo ra chỉ một cách rõ ràng những gì bạn nghĩ là cần thiết (trong trường hợp này là chỉ mục) và xem điều gì xảy ra khi bạn chạy di chuyển. Lý do đằng sau điều này là nếu cột :deal_id của bạn đã được lập chỉ mục và di chuyển của bạn cố gắng lập chỉ mục lại, nó sẽ gặp lỗi và quá trình di chuyển sẽ khôi phục để bạn có thể khắc phục. Tuy nhiên nếu bạn không thêm chỉ mục trong quá trình di chuyển, bạn rõ ràng sẽ không gặp bất kỳ lỗi nào nhưng bạn phải thực hiện thêm một bước để kiểm tra xem chỉ mục có tồn tại hay không.

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 

Lưu ý rằng bạn cũng muốn thêm chỉ mục sau khi quá trình tạo bảng hoàn tất. Sử dụng helper add_index bên trong helper create_table có lẽ sẽ gây ra lỗi.