我正在尝试通过关联来限制has_many,以便在使用.includes(:model)
这是我到目前为止所拥有的:
class Student < ActiveRecord::Base
has_many :courses, :through => :students_courses
has_many :sample_courses, :through => :students_courses, :limit => 3, :source => :course, :order => 'updated_at DESC'
end
class Course < ActiveRecord::Base
has_many :students, :through => :students_courses
end
到目前为止一切顺利。如果我启动rails控制台并加载学生,我可以访问示例课程并返回三个结果。但是,当我有查询并尝试includes
时,在视图中尝试打印出课程名称,它会加载学生的所有课程,而不仅仅是三个。
# Query in controller
@students.where(...stuff..).includes(:sample_courses)
# In the view -
@students.each do |student| courses = student.sample_courses
最后一个courses
变量返回与学生相关的所有课程,而不仅仅是三个示例课程。如果我跳过控制器中的includes
并保持视图相同,则它会正确查询示例课程。当然,你正在运行我试图避免的n个查询。
那么我怎样才能加载3门课程呢?
答案 0 :(得分:2)
当您使用预先加载关联时:limit
已忽略,如API文档中所述:
如果您希望加载具有指定:limit选项的关联,那么 将被忽略,返回所有关联的对象,例如:
class Picture < ActiveRecord::Base
has_many :most_recent_comments, :class_name => 'Comment', :order => 'id DESC', :limit => 10
end
Picture.includes(:most_recent_comments).first.most_recent_comments # => returns all associated comments.
如果你想加载3门课程,也许你可以使用它:
courses = student.sample_courses.limit(3)