Ruby on rails 如何通过Rails ActiveRecord中的连接正确地为has\u many添加别名?
这里是Rails/ActiveRecord新手。考虑以下模型:教室、用户和教室(两个连接)< /P>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
课堂{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