Rails迁移文件无法访问模型

时间:2015-07-12 00:11:55

标签: mysql ruby-on-rails ruby

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

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)

我的迁移文件无法访问EnrollmentEnrollmentState模型的任何想法?或者如何以另一种方式做到这一点?

1 个答案:

答案 0 :(得分:1)

Rails可以很好地找到模型,但是它会在错误的表格中查找您的注册表。正如您已经发现的那样,应该设置table_name模型的Enrollment

Rails是围绕强大的惯例建立的,遵循它们,一切都趋于顺利。打破他们,你最终会像纳粹会议中的阻力女王一样。

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

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

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