2015-07-12 48 views
1

我有一個Enrollment模型,其中status列填充了(格式不正確)的種子文件。目前,所有這些status值都可在EnrollmentStatestateId(其中包含負值且不是表格的典型索引列)中找到。以下是相關的架構表:Rails遷移文件無法訪問模型

db/schema.rb

我已經創造了Enrollment模型來創建具有關聯關係的enrollment_state_id列,並希望能與對應於statusEnrollment_State 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

請勿在數據庫列中使用大寫字母 - 任何以大寫字母開頭的字符都應該是Ruby中的常量,而具有像「Foo.BAR」或「Foo.Bar」等屬性的Rails模型真的讓人困惑。改用蛇形箱。 – max

+0

你不會碰巧在你的'app/models/enrollment.rb'中做了'table_name'enrollment''這樣的愚蠢行爲嗎? Rails可以找到模型 - 但sql查詢使用的是錯誤的表名。這是最有可能的原因,除非你已經搞糊塗了[inflector](http://api.rubyonrails.org/classes/ActiveSupport/Inflector/Inflections.html)這個單詞'enrollment',這是不太可能的。 – max

+0

@max,我確實做了一些愚蠢的事情。我在'app/models/enrollment.rb'中有self.table_name ='enrollment'。我不記得爲什麼,也許對於我已經實現的搜索功能。我不能說我明白爲什麼這麼糟糕,但我會嘗試改變它,看看會發生什麼。 –

回答

1

Rails可以找到合適的模型,但它在您的註冊表中查找錯誤的表格。正如你已經發現這是由於你的Enrollment模型的table_name

Rails建立在強大的約定之上,遵循它們,一切都趨於平穩。打破他們,你最終像一個納粹大會上的女王。

ActiveRecord約定是模型具有單數名稱(User),它對應於複數users中的表格。以_id結尾的列是外鍵。

由於如果您必須從其他地方使用現有的數據庫結構,Rails如此強大地構建於慣例上,而不是第一步,應該編寫遷移以將數據庫擊敗到一致性。將列重命名爲snake_case。確保引用其他表的列具有索引和外鍵。這避免了愚蠢的耗時錯誤,因爲你已經完成了'status_id'(這是正確的),而不是statusId

而且您將能夠將您的工作傳遞給其他開發人員,而不會感到羞恥。

+0

並從種子文件中獲取該SQL文件的解決方案。只需使用種子創建需要在數據庫中以便應用程序工作的記錄。 絕對不會有任何東西在你的應用中執行ALTER或CREATE TABLE語句,除了你的遷移。 – max

+0

非常感謝你,我的一部分任務是解決sql文件問題,我已經做了很多,但是會根據你提到的Rails約定繼續這樣做。更多的移民來了。再次感謝! –