Rails“ActiveRecord_Associations_CollectionProxy的未定义方法”

时间:2015-07-14 14:40:00

标签: ruby-on-rails ruby postgresql ruby-on-rails-4 activerecord

我有这个型号:

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&gt;

如果我写这个:

@students = @movie.cinema.companies.find(6).students.all

它在我的select_collection中向我展示了正确的学生。

如何更好地了解这一过程?

更新

我需要收集这部电影电影公司的每个学生的收藏。

怎么写?

1 个答案:

答案 0 :(得分:4)

正如Nermin所描述的那样,您试图从一系列儿童中请求收集儿童。

您可以使用collect从以下方面收集公司的学生:

@movie.cinema.companies.collect(&:students).flatten.uniq

但我认为你最好按照以下方式为你的学生模型添加一个范围:

scope :for_companies, ->(_companies) {joins(:companies).where(company: _companies)}

使用Student.for_companies(@movie.cinema.companies)

调用

免责声明:未经测试,但应该是一个起点!