2012-07-18 40 views
6

Có sự khác biệt nào giữa việc sử dụng t.references và thực hiện lệnh SQL để tạo mối quan hệ khóa ngoài giữa productscategory bảng như sau? Nói cách khác, là hai cách khác nhau để làm điều tương tự hoặc tôi thiếu bất cứ điều gì ở đây?Sự khác biệt giữa ràng buộc và tham chiếu khóa ngoài trong Rails

class ExampleMigration < ActiveRecord::Migration 
    def up 
    create_table :products do |t| 
     t.references :category 
    end 
    #add a foreign key 
    execute <<-SQL 
     ALTER TABLE products 
     ADD CONSTRAINT fk_products_categories 
     FOREIGN KEY (category_id) 
     REFERENCES categories(id) 
    SQL 
    add_column :users, :home_page_url, :string 
    rename_column :users, :email, :email_address 
    end 

    def down 
    rename_column :users, :email_address, :email 
    remove_column :users, :home_page_url 
    execute <<-SQL 
     ALTER TABLE products 
     DROP FOREIGN KEY fk_products_categories 
    SQL 
    drop_table :products 
    end 
end 

Trả lời

0

Tôi đã tìm thấy một số điều intresting trong trang này.

http://railsforum.com/viewtopic.php?id=17318

Từ một bình luận:

Rails không sử dụng phím nước ngoài để thực hiện nhiệm vụ phụ trợ của mình. Điều này vì một số db như sqlite không cho phép các khóa nước ngoài trên các bảng của nó. Vì vậy, Rails không cung cấp trợ giúp để tạo khóa ngoài

Ngoài ra còn có một viên ngọc để thêm bàn phím ngoài vào bảng cơ sở dữ liệu. What creates the FOREIGN KEY constraint in Ruby on Rails 3?

+3

Rails 4.2 hiện hỗ trợ các ràng buộc khóa ngoài cho các bộ điều hợp hỗ trợ chúng: http://edgeguides.rubyonrails.org/4_2_release_notes.html#foreign-key-support –

2

Chúng không giống nhau. Rails theo mặc định không thực thi các khóa ngoại trong cơ sở dữ liệu. Thay vào đó, tài liệu tham khảo khi tạo từ dòng lệnh cũng tạo ra một chỉ số thông thường, như thế này:

add_index :products, :category_id 

Cập nhật:

Rails 5 thực hiện chính xác những điều tương tự bây giờ. Vì vậy, để trả lời câu hỏi ban đầu: Ngày nay, cả hai đều giống nhau.

+0

Vì vậy, các tham chiếu trong Rails về bản chất là ngoại lệ + chỉ mục trên khóa ngoại đó? – geoboy

+0

@geoboy Điều này thực sự đã thay đổi trong các phiên bản gần đây. 't.references' cũng đặt khóa ngoại với chỉ mục. http://edgeapi.rubyonrails.org/classes/ActiveRecord/ConnectionAdapters/SchemaStatements.html#method-i-add_reference –

+0

Đó là những gì tôi đã tìm. Nhưng nếu tôi thiết lập khóa và chỉ mục ngoại một cách riêng biệt thì nó có tác dụng tương tự không? Hoặc có lợi thế là có 't.references' trong tệp' schema.db' (chứ không phải là 'external_key' và' index') không? – geoboy

Các vấn đề liên quan