Ruby on rails 如何通过Rails ActiveRecord中的连接正确地为has\u many添加别名?

Ruby on rails 如何通过Rails ActiveRecord中的连接正确地为has\u many添加别名?,ruby-on-rails,ruby,activerecord,Ruby On Rails,Ruby,Activerecord,这里是Rails/ActiveRecord新手。考虑以下模型:教室、用户和教室(两个连接)< /P> 课堂{where(duration:'full-time')},班级名称:“ClassroomEnrollments” 有许多:全职人员,:通过=>:全职人员注册,课程名称:“用户” 有很多:兼职登记,->{where(持续时间:'part-time')},班级名称:“ClassroomEnrollments” 有很多:兼职者,:通过=>:兼职注册,课程名称:“用户” 结束 类Classroom

这里是Rails/ActiveRecord新手。考虑以下模型:教室、用户和教室(两个连接)< /P>
课堂{where(duration:'full-time')},班级名称:“ClassroomEnrollments”
有许多:全职人员,:通过=>:全职人员注册,课程名称:“用户”
有很多:兼职登记,->{where(持续时间:'part-time')},班级名称:“ClassroomEnrollments”
有很多:兼职者,:通过=>:兼职注册,课程名称:“用户”
结束
类ClassroomEnrollment:教室注册
结束
教室和教室注册的以下模型不起作用。特别是
:fulltimers
:parttimers
别名在我试图通过
我的教室.fulltimers
我的教室.parttimers
访问它们时,为nil:NilClass抛出
未定义的方法'to_sym'

如果我删除
:parttimers
别名并将
:fulltimers
重命名为
:users
,它可以正常工作(并且只显示全日制学生),因此在我看来,这与找出
:fulltimers
属于
User
类型有关,即使我已经指定了
类名:“User”
中的
具有许多
条件


我做错了什么?

由于无法自动推断源关联,您需要使用
:source
选项指定它:

class Classroom < ActiveRecord::Base
  has_many(
    :fulltime_enrollments, 
    -> { where(duration: 'full-time') }, 
    class_name: "ClassroomEnrollments"
  )
  has_many :fulltimers, :through => :fulltime_enrollments, :source => :user

  has_many(
    :parttime_enrollments, 
    -> { where(duration: 'part-time') }, 
    class_name: "ClassroomEnrollments"
  )
  has_many :parttimers, :through => :parttime_enrollments, :source => :user
end

我在做类似的事情时偶然发现了这个。这将生成相同的sql,并且更易于查看

class Classroom < ActiveRecord::Base
  has_many :classroom_enrollments
  has_many :users, through: :classroom_enrollments

  def fulltimers
    users.merge(ClassroomEnrollment.full_time)
  end

  def parttimers
    users.merge(ClassroomEnrollment.part_time)
  end
end

class ClassroomEnrollment < ActiveRecord::Base
  belongs_to :user
  belongs_to :classroom

  scope :fulltime, ->{ where(duration: 'full-time') }
  scope :parttime, ->{ where(duration: 'part-time') }
end

class User < ActiveRecord::Base
  has_many :classroom_enrollments
  has_many :classrooms, :through => :classroom_enrollments
end
课堂{where(持续时间:'full-time')}
作用域:兼职,->{where(持续时间:'part-time')}
结束
类用户:教室注册
结束

这是否仍然提供类似于
我的教室。全日制
class Classroom < ActiveRecord::Base
  has_many :classroom_enrollments
  has_many :users, through: :classroom_enrollments

  def full_timers
    users_by_duration("full-time")
  end

  def part_timers
    users_by_duration("part-time")
  end

  private

  def users_by_duration(duration)
    users.where(classroom_enrollments: { duration: duration })
  end
end
my_classroom = Classroom.find(1)
my_classroom.full_timers
class Classroom < ActiveRecord::Base
  has_many :classroom_enrollments
  has_many :users, through: :classroom_enrollments

  def fulltimers
    users.merge(ClassroomEnrollment.full_time)
  end

  def parttimers
    users.merge(ClassroomEnrollment.part_time)
  end
end

class ClassroomEnrollment < ActiveRecord::Base
  belongs_to :user
  belongs_to :classroom

  scope :fulltime, ->{ where(duration: 'full-time') }
  scope :parttime, ->{ where(duration: 'part-time') }
end

class User < ActiveRecord::Base
  has_many :classroom_enrollments
  has_many :classrooms, :through => :classroom_enrollments
end