我有一个Enrollment
模型,其中status
列由一个(格式不正确的)种子文件填充。目前,所有这些status
值都可以在EnrollmentState
列stateId
中找到(其中包含负值,并不代表表格的典型索引列)。以下是相关的模式表:
db/schema.rb
create_table "enrollment_states", force: :cascade do |t|
t.integer "stateId", limit: 1, default: 0, null: false
t.string "Name", limit: 20
t.boolean "Display", limit: 1, default: false
end
create_table "enrollments", force: :cascade do |t|
t.integer "status", limit: 1, default: 0
t.integer "project_id", limit: 2, default: 0, null: false
t.integer "subjId", limit: 4, null: false
t.integer "homeId", limit: 4, null: false
t.datetime "startDate"
t.integer "RAId", limit: 4, default: 0
t.integer "eligibility_state_id", limit: 1, default: 0, null: false
t.integer "secondary", limit: 1, default: 0, null: false
t.integer "idx", limit: 4, default: 0, null: false
t.integer "enrollment_state_id", limit: 4
end
我在enrollment_state_id
模型中创建了Enrollment
列以创建关联,并希望使用与Enrollment_State
列对应的status
ID填充该关联。
我尝试使用以下迁移执行此操作:
class UpdateColumnValues < ActiveRecord::Migration
def change
Enrollment.connection.schema_cache.clear!
Enrollment.reset_column_information
Enrollment.all.each do |e|
e.update_attribute(enrollment_state_id: EnrollmentState.find_by(stateId: e.status).id)
end
end
end
但是,迁移文件无法在数据库中找到Enrollment
数据!运行rake db:migrate
后,我在控制台中收到此错误:
rake aborted!
StandardError: An error has occurred, all later migrations canceled:
Mysql2::Error: Table 'enrollment.enrollment' doesn't exist: SELECT `enrollment`.* FROM `enrollment`/Users/ben/Desktop/enrollment_app/db/migrate/20150711175101_update_column_values.rb:6:in `change'
ActiveRecord::StatementInvalid: Mysql2::Error: Table 'enrollment.enrollment' doesn't exist: SELECT `enrollment`.* FROM `enrollment`
/Users/ben/Desktop/enrollment_app/db/migrate/20150711175101_update_column_values.rb:6:in `change'
Mysql2::Error: Table 'enrollment.enrollment' doesn't exist
/Users/ben/Desktop/enrollment_app/db/migrate/20150711175101_update_column_values.rb:6:in `change'
Tasks: TOP => db:migrate
(See full trace by running task with --trace)
我的迁移文件无法访问Enrollment
或EnrollmentState
模型的任何想法?或者如何以另一种方式做到这一点?
答案 0 :(得分:1)
Rails可以很好地找到模型,但是它会在错误的表格中查找您的注册表。正如您已经发现的那样,应该设置table_name
模型的Enrollment
。
Rails是围绕强大的惯例建立的,遵循它们,一切都趋于顺利。打破他们,你最终会像纳粹会议中的阻力女王一样。
ActiveRecord约定是模型具有单数名称(User
),其对应于复数users
中的表。以_id
结尾的列是外键。
由于如果你必须使用来自其他地方的现有数据库结构,Rails如此强大地构建在约定上而不是第一步,因此应该编写迁移以使数据库符合要求。将列重命名为snake_case
。确保引用其他表的任何列都具有索引和外键。这避免了愚蠢的耗时错误,因为您已经完成了'status_id'(这是正确的)而不是statusId
。
您将能够将您的工作传递给其他开发人员而不会感到羞耻。