使用t.references
和执行SQL
命令在products
和category
表之间创建外键关系有什么区别,如下所示?换句话说,两种不同的方式做同样的事情还是我错过了什么?
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
答案 0 :(得分:2)
他们不是一回事。默认情况下,Rails不会在数据库中强制使用外键。相反,从命令行创建时的引用也会创建一个常规索引,如下所示:
add_index :products, :category_id
<强>更新强>
Rails 5现在实际上完全相同。所以,回答最初的问题:现在两者都是一样的。
答案 1 :(得分:0)
我在这个页面中找到了一些有趣的东西。
http://railsforum.com/viewtopic.php?id=17318
来自评论:
Rails不使用外键来执行后端任务。这个 因为像sqlite这样的某些db不允许在其表上使用外键。 因此Rails不提供构建外键的帮助程序
还有一个gem foreigner用于向数据库表添加外键。 What creates the FOREIGN KEY constraint in Ruby on Rails 3?