我有这个模型:

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 中正确的学生。

如何更好地理解这个过程?

更新 :

我需要这部电影的电影院公司的每个学生的collection_select。

怎么写?

最佳答案

正如 Nermin 所描述的,你试图从一个 child 的集合中请求一个 child 的集合。

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

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

但我认为您最好按照以下方式为您的学生模型添加一个范围:
scope :for_companies, ->(_companies) {joins(:companies).where(company: _companies)}

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

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

关于ruby-on-rails - Rails "undefined method for ActiveRecord_Associations_CollectionProxy",我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31409792/

10-10 14:39