我正在创建一个主要的 - >在进行数据库设计时,我的列之间的外键关系。我的数据库设计应该是:
用户表:userid(主键),名称
购物清单表:shoppingid(主键),userid(外键)
这是我的迁移文件:
foo.conf
在创建表而不是创建新的迁移文件时,是否有办法创建上述内容?
我使用此命令检查我的关系,但我没有看到任何关系:
class CreateUsers < ActiveRecord::Migration
def change
create_table :users do |t|
t.integer :userid, :primary_key
has_many :shoppinglists, dependent: :destroy
t.timestamps null: false
end
end
end
class CreateShoppinglists < ActiveRecord::Migration
def change
create_table :shoppinglists do |t|
t.integer :shoppingid, :primary_key
t.belongs_to :userid
t.timestamps null: false
end
end
end
答案 0 :(得分:3)
由于您的迁移无法应用,您可能认为它包含错误。您似乎不了解迁移的目的及其与模型的区别。此外,您违反了许多惯例,因此它会做一些您不期望的事情。
has_many
和belongs_to
不是迁移&#39;范围。这些方法来自模型,它们添加的只是一些查询方法。它们甚至可以在没有迁移机制的现有数据库上使用,尽管可能很糟糕。id
,除非在id: false
中使用选项create_table
另有说明。因此,添加另一个并违反惯例会自担风险。snake_case
,而不是likethis
。它使用它来适当地复数和单一化给定的术语以通过惯例推断配置。因此,外键列以<ASSOCIATION>_id
形式指定,i。即user_id
。sqlite
一起使用,因此Rails默认情况下不会添加这些内容。遵循约定时,您只需要指定受影响的表,Rails将推断其余的。当然,请确保在尝试之前运行Rails 4.2(或更新版本)。在此之前,主外键的概念不属于数据库,而是属于通过has_many
和公司生成自己的查询的模型。 答案 1 :(得分:2)
您可以创建类似以下内容的迁移:
rails g migration addShoppingListAssociationToUsers
并且有与迁移内容类似的内容:
class AddShoppingListAssociationToUser < ActiveRecord::Migration
def change
add_reference :shoppinglists, :user, index: true, foreign_key: true
end
end
答案 2 :(得分:1)
我假设您不需要显式创建主键,并且可以使用Rails自动为每个表生成的主键。
# User.rb
has_many :shopping_lists
# ShoppingList.rb
belongs_to :user
# Migration Files
class CreateUsers < ActiveRecord::Migration
def change
create_table :users do |t|
t.string :name
t.timestamps null: false
end
end
end
class CreateShoppinglists < ActiveRecord::Migration
def change
create_table :shoppinglists do |t|
t.references :user, index: true
t.timestamps null: false
end
end
end