Rails - 数据库迁移最佳实践
Rails - DB migration best practice
我设计了以下迁移,并想与社区确认是否满足 rails 迁移的最佳实践。我是 运行 一个 postgres 数据库。
我正在尝试实现一个数据库结构,其中附加到用户的各种状态存储在单独的 table 中。例如,它的婚姻状况。
如果这听起来像是一个相当有效的 table 设计,请告诉我。以及我可以改进的地方。
class CreatePrequalifications < ActiveRecord::Migration[5.2]
def change
create_table :prequalifications do |t|
t.string :attachment
t.text :description
t.integer :marital_status
t.integer :professional_status
t.integer :collateral_status
t.integer :income_direct
t.integer :income_support
t.integer :income_scolarship
t.integer :income_other
t.boolean :blacklist
t.references :user, foreign_key: true
t.timestamps
end
end
create_table :marital_status do |t|
t.string :single
t.string :married
t.string :other
t.string :divorced
t.string :with_dependants
t.references :user, foreign_key: true
t.references :prequalifications, foreign_key: true
end
create_table :professional_status do |t|
t.string :self_employed
t.string :employed
t.string :student
t.string :other
t.text :description
t.datetime :contract_created_at
t.datetime :contract_terminated_at
t.references :user, foreign_key: true
t.references :prequalifications, foreign_key: true
end
create_table :collateral_status do |t|
t.string :collateral_name
t.string :collateral_income
t.boolean :visale_collateral
t.boolean :student_collateral
t.boolean :bank_collateral
t.references :user, foreign_key: true
t.references :prequalifications, foreign_key: true
end
结束
让我们开始:
是单次迁移吗?如果是这样,我会首先将它分成几个迁移(每个 table)。
为每个 table (t.timestamps null: false
) 添加时间戳。稍后你会感谢我的;)
对于状态 tables (martial_status
, professional_status
) 创建更简单的 tables 仅包含名称和引用(无需创建列对于每个值)。此外,您可能不需要 table 作为婚姻状况,因为您可以使用 classy_enum 代替。
在 prequalifications
中,您有用于关系的整数列(maritial_status
、professional_status
)。不要那样做,使用 references
.
对于布尔列,定义默认值。
在这种情况下,最佳做法是:
- 将每个
create_table
分解为自己的迁移。
- 您的 table 名称应该是复数形式,例如
marital_statuses
。
- 时间戳是个好主意。
- 考虑为将定期查询的字段添加索引,例如模型名称、用户电子邮件或外键。
查看 rails 迁移指南以获取有关最佳实践的信息:https://edgeguides.rubyonrails.org/active_record_migrations.html
我设计了以下迁移,并想与社区确认是否满足 rails 迁移的最佳实践。我是 运行 一个 postgres 数据库。
我正在尝试实现一个数据库结构,其中附加到用户的各种状态存储在单独的 table 中。例如,它的婚姻状况。
如果这听起来像是一个相当有效的 table 设计,请告诉我。以及我可以改进的地方。
class CreatePrequalifications < ActiveRecord::Migration[5.2]
def change
create_table :prequalifications do |t|
t.string :attachment
t.text :description
t.integer :marital_status
t.integer :professional_status
t.integer :collateral_status
t.integer :income_direct
t.integer :income_support
t.integer :income_scolarship
t.integer :income_other
t.boolean :blacklist
t.references :user, foreign_key: true
t.timestamps
end
end
create_table :marital_status do |t|
t.string :single
t.string :married
t.string :other
t.string :divorced
t.string :with_dependants
t.references :user, foreign_key: true
t.references :prequalifications, foreign_key: true
end
create_table :professional_status do |t|
t.string :self_employed
t.string :employed
t.string :student
t.string :other
t.text :description
t.datetime :contract_created_at
t.datetime :contract_terminated_at
t.references :user, foreign_key: true
t.references :prequalifications, foreign_key: true
end
create_table :collateral_status do |t|
t.string :collateral_name
t.string :collateral_income
t.boolean :visale_collateral
t.boolean :student_collateral
t.boolean :bank_collateral
t.references :user, foreign_key: true
t.references :prequalifications, foreign_key: true
end
结束
让我们开始:
是单次迁移吗?如果是这样,我会首先将它分成几个迁移(每个 table)。
为每个 table (
t.timestamps null: false
) 添加时间戳。稍后你会感谢我的;)对于状态 tables (
martial_status
,professional_status
) 创建更简单的 tables 仅包含名称和引用(无需创建列对于每个值)。此外,您可能不需要 table 作为婚姻状况,因为您可以使用 classy_enum 代替。在
prequalifications
中,您有用于关系的整数列(maritial_status
、professional_status
)。不要那样做,使用references
.对于布尔列,定义默认值。
在这种情况下,最佳做法是:
- 将每个
create_table
分解为自己的迁移。 - 您的 table 名称应该是复数形式,例如
marital_statuses
。 - 时间戳是个好主意。
- 考虑为将定期查询的字段添加索引,例如模型名称、用户电子邮件或外键。
查看 rails 迁移指南以获取有关最佳实践的信息:https://edgeguides.rubyonrails.org/active_record_migrations.html