0

使用時に結果の数を制限したい特定のインスタンスの関連付けを通じて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コンソールを起動して学生をロードすると、サンプルコースにアクセスでき、3つの結果が返されます。ただし、クエリを実行して試してみるとincludes、コース名を印刷しようとしているビューで、3つだけでなく、学生のすべてのコースがロードされます。

# Query in controller
@students.where(...stuff..).includes(:sample_courses)

# In the view -
@students.each do |student| courses = student.sample_courses

この最後のcourses変数は、3つのサンプルコースだけでなく、学生に関連付けられているすべてのコースを返します。コントローラでをスキップしincludesてビューを同一に保つと、サンプルコースが正しくクエリされます。もちろん、あなたは私が避けようとしているn個のクエリを実行しています。

では、どうすれば3つのコースを熱心にロードできますか?

4

1 に答える 1

2

APIドキュメントにあるように、アソシエーションを熱心にロードする場合、:limitは無視します。

指定された: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)
于 2012-11-14T08:04:37.223 に答える