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

标签 mysql ruby-on-rails ruby

我有一个 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/

相关文章:

mysql - SQL变量赋值和比较逻辑

php - WordPress mysql 错误

php - 在插入时获取一张表的 auto_increment 值的最佳方法

PHP - 复选框值/数据库插入和 if(isset())

ruby-on-rails - 在 activeadmin 资源中需要范围

ruby-on-rails - 如何在一个表中添加对同一模型的多个引用的迁移? ruby /rails

ruby-on-rails - 在 Rails 应用程序中查找未使用的代码

ruby-on-rails - EC2 实例在负载均衡器中停止服务

ruby - Tux 与 Sinatra 无法加载

ruby-on-rails - 什么时候应该在 Rails 应用程序中使用 RESTful Controller ,什么时候不应该?