0

現在、データの移行や問題が発生しています。 私はマイグレーションファイルにこれを持っています。Rails 5でマイグレーションのモデルが定義されていない

class DropTutorProfileTable < ActiveRecord::Migration[5.1] 
    class Subject < ActiveRecord::Base 
    has_and_belongs_to_many :tutor_accounts 
    end 

    class TutorAccount < ActiveRecord::Base 
    has_and_belongs_to_many :subjects 
    end 

    def change 
    send_data_to_subject_tutor_account 
    drop_table :tutor_profiles 
    end 

    private 

    def send_data_to_subject_tutor_account 
    TutorProfile.all.find_each do |tutor_profile| 
     # data migration code here 
     tutor_account.subjects << subject 
    end 
    end 
end 

この移行を実行すると、次のエラーが発生します。

StandardError: An error has occurred, this and all later migrations canceled: 

Subject(#70181814234340) expected, got #<DropTutorProfileTable::Subject id: 3, name: "Writing", academic_type: "academic"> which is an instance of DropTutorProfileTable::Subject(#70181808133400) 

私はこの問題を初めて処理しています。私はマイグレーション時にモデルを定義し、問題はない他のマイグレーションを行ってきました。興味深いことに、ときI出力TutorAccountインスタンスのクラスとSubjectインスタンスのクラス、私はここで何が起こっているか見当がつかない...

TutorAccount 
DropTutorProfileTable::Subject 

を取得します。あなたの助けが大変ありがとう!

+0

'TutorAccount'というクラスがプロジェクト内の別の場所では定義されていないが、ネストされていないクラスを再確認できますか? – Shiko

+0

'tutor_profile'の科目を' tutor_account'に割り当てようとしていますか? 「面白い」であるあなたの最後の質問に>あなたはこの移行中に 'Subject'クラスを定義しているので、それは実際には' – inveterateliterate

+0

をDropTutorProfileTable'で名前空間されるだろう。また、私は明示的にTutorProfileSubject' 'のようなテーブルを結合作成するのではなく頼って推薦します'has_and_belongs_to_many'にあります。なぜそれが推奨されるアプローチなのか、いくつかの素晴らしい例があります。 – inveterateliterate

答えて

0

私はこの問題を解決しました。問題は、移行中にクラスのインスタンスがどのように呼び出されたかです。マイグレーションコードでマイグレーションで定義されたモデルを直接呼び出す場合、マイグレーションの名前空間になります。例えば。

class DropTutorProfileTable < ActiveRecord::Migration[5.1] 
    class Subject < ActiveRecord::Base; end 

    def change 
    Subject.new.class # Returns DropTutorProfileTable::Subject 
    TutorProfile.subject.class # Returns Subject 
    end 
end 

Subjectクラスは、移行中に定義されており、独自のエンティティとして呼び出されているので、これは理にかなっています。ただし、関連付けられたサブジェクトのクラスは、マイグレーションではなくコードベースで定義されたSubjectクラスによって定義されます。これは、普通のルビを理解している場合には明白でなければならない動作です。私は実際にこのコードを例として実行し、私の論文を検証しました。感謝@inveterateliterateと@Shikoは正しい方向に私を指しています。

関連する問題