Rails“ActiveRecord_Associations_CollectionProxy的未定义方法”
我有这个型号:
class Student < ActiveRecord::Base has_many :tickets has_many :movies, through: :tickets end class Movie < ActiveRecord::Base has_many :tickets, dependent: :destroy has_many :students, through: :tickets belongs_to :cinema end class Ticket < ActiveRecord::Base belongs_to :movie, counter_cache: true belongs_to :student end class Cinema < ActiveRecord::Base has_many :movies, dependent: :destroy has_many :students, through: :movies has_many :schools, dependent: :destroy has_many :companies, through: :yard_companies end class School < ActiveRecord::Base belongs_to :company belongs_to :student belongs_to :cinema, counter_cache: true end class Teacher < ActiveRecord::Base belongs_to :movie, counter_cache: true belongs_to :company end class Contract < ActiveRecord::Base belongs_to :company belongs_to :student end class Company < ActiveRecord::Base has_many :teachers has_many :movies, through: :teachers has_many :contracts has_many :students, through: :contracts end
如果我在movies_controller.rb中写这个:
@students = @movie.cinema.companies.students.all
我有这个错误:
未定义的方法’学生’为#Company :: ActiveRecord_Associations_CollectionProxy:0x00000007f13d88>
如果相反我写这个:
@students = @movie.cinema.companies.find(6).students.all
它在我的select_collection中显示了正确的学生。
如何更好地理解这个过程?
更新 :
我需要收集这部电影电影公司的每个学生的集合。
怎么写?
正如Nermin所描述的那样,您正试图从一系列儿童中请求一系列儿童。
您可以使用collect
来收集公司的学生:
@movie.cinema.companies.collect(&:students).flatten.uniq
但我认为你最好在学生模型中添加一个范围:
scope :for_companies, ->(_companies) {joins(:companies).where(company: _companies)}
与Student.for_companies(@movie.cinema.companies)
免责声明:未经测试,但应该是一个起点!
@students = @movie.cinema.companies.students.all
来解释为什么会抛出错误
@movie.cinema
将为您提供电影的电影
@movie.cinema.companies
将为您提供该影院的公司列表作为ActiveRecord_Association_CollectionProxy
然后,当您通过@movie.cinema.companies.students
呼叫公司CollectionProxy
上的students
时,它会抛出一个错误,因为CollectionProxy
没有这样的方法。
@students = @movie.cinema.companies.find(6).students.all
将工作,因为你得到了一个公司列表,然后从该列表中找到一个id为6的公司,并列出该公司的所有学生。