6

rails 3.0アプリケーションをrails 4.0にアップグレードしようとしています。私が気づいた行動の1つは、モデル間の関係が機能しなくなったことです。Rails 4 Has_many:selectとの結合関係

は、我々は次のモデルがあるとします。

class Student < ActiveRecord::Base 
    has_many :teacher_students 
    has_many :teachers, :through => :teacher_students, :select => 'teacher_students.met_with_parent, teachers.*' 

    # The Rails 4 syntax 
    has_many :teachers, -> { select('teacher_students.met_with_parent, teachers.*') }, :through => :teacher_students 

end 

class Teacher < ActiveRecord::Base 
    has_many :teacher_students 
    has_many :students, :through => :teacher_students, :select => 'teacher_students.met_with_parent, students.*' 
end 

class TeacherStudent < ActiveRecord::Base 
    belongs_to :teacher 
    belongs_to :student 
    # Boolean column called 'met_with_parent' 
end 

は、今では行うことができます:

teacher = Teacher.first 
students = teacher.students 
students.each do |student| 
    student.met_with_parent  # Accessing this column which is part of the join table 
end 

これはRailsの3.0のために働いていたが、現在はRailsの4.0に私はRailsのを信じてUnknown column 'met_with_parent' in 'field list'を取得しています4はスマートで、与えられた結合表全体をロードしないようにしようとしています。

+0

古い構文はRails 4.0で機能しますか? – lurker

+0

@mbratchいいえうまくいきません。同じ問題が発生します。古い構文では、Rails 4は一連の非推奨メッセージを記録します。 – Bill

+0

teacher_students.met_with_parentをmet_with_parentとして選択しようとするとどうなりますか? – faron

答えて

3

私は個人的にスコープを使用して、以下の方法をお勧めします:

class Student < ActiveRecord::Base 
    has_many :teacher_students 
    has_many :teachers, :through => :teacher_students 
end 

class Teacher < ActiveRecord::Base 
    has_many :teacher_students 
    has_many :students, :through => :teacher_students 

    scope :met_with_parent, -> { joins(:teacher_students).where('teacher_students.met_with_student = ?', true) } 
end 

class TeacherStudent < ActiveRecord::Base 
    belongs_to :teacher 
    belongs_to :student 
end 

その後、次の操作を行うことができます

Teacher.first.students.met_with_parent 

これは、必要なときにあなたが関係およびフィルタを維持することができます。

+0

( 'teacher_students.met_with_student =?'、true) - ugh。ただ、いいえ。必要なのは "where( 'teacher_students.met_with_student')です。それ以外は、よく見えます。 –

関連する問題