gpt4 book ai didi

mysql - Rails 迁移文件无法访问模型

转载 作者:行者123 更新时间:2023-11-28 23:57:09 25 4
gpt4 key购买 nike

我有一个 Enrollment 模型,其中包含一个 status 列,该列由一个(格式不正确的)种子文件填充。目前,所有这些 status 值都可以在 EnrollmentStatestateId 中找到(它包含负值,并不意味着是典型的索引列一张 table )。以下是相关的架构表:

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 模型中创建了 enrollment_state_id 列来创建关联,并希望用对应的 Enrollment_State id 填充它到 status 列。

我尝试通过以下迁移来做到这一点:

  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)

知道为什么我的迁移文件无法访问我的 EnrollmentEnrollmentState 模型吗?或者如何以其他方式做到这一点?

最佳答案

Rails 可以很好地找到模型,但它正在为您的注册查找错误的表。正如您已经发现的那样,这是由于设置了 Enrollment 模型的 table_name

Rails 是围绕强大的约定构建的,遵循它们,一切都会非常顺利。打破它们,你最终会像纳粹大会上的变装皇后一样。

ActiveRecord 约定是模型有一个单数名称 (User),它对应复数 users 中的表。以 _id 结尾的列是外键。

由于 Rails 是建立在约定之上的,所以如果您必须使用其他地方的现有数据库结构,那么第一步应该编写迁移以击败数据库以使其符合要求。将列重命名为 snake_case。确保引用其他表的任何列都有索引和外键。这避免了愚蠢的耗时错误,因为你已经完成了“status_id”(这是正确的)而不是 statusId

而且您将能够将您的工作交给其他开发人员而不会感到羞耻。

关于mysql - Rails 迁移文件无法访问模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31363110/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com