2017-05-16 10 views
1

生徒が割り当てられたテストを試みたかどうかを確認しようとしています。複数のモデルをチェーン化してSQLクエリの数を減らす方法

class Test < ActiveRecord::Base 
    has_many :assigns 
    has_many :attempts 
    belongs_to :topic 
end 

class Topic < ActiveRecord::Base 
    has_many :tests 
    has_many :attempts 
    has_many :assigns, through: :test 
end 

class Assign < ActiveRecord::Base 
    belongs_to :test 
    belongs_to :student 
    has_many :attempts 
end 

class Attempt < ActiveRecord::Base 
    belongs_to :test 
    belongs_to :topic 
    belongs_to :assign 
    belongs_to :student 
end 
私は特定の学生(ID:100)かどうかを確認したい

:割り当てられたテストをしようとしたか、私は私のモデルがあり、次のちょうど1にクエリの数をダウンさせるために、関連するモデルチェーンにしたいですまた、テストのトピック名などのその他の詳細も取得します。

ta = Assign.includes(:test => {:topic => :attempts}) 

これは私がそのようなことは、単一のクエリ内などに割り当てられたTEST_NAME、TOPIC_NAME、などの詳細を取得することができます。これまでのところ私はこのようなものを持っています。 student_id:100の試行記録を同じクエリに含めるにはどうすればよいですか?私が今持っているもので、生徒の試行の詳細を取得すると、新しいクエリが生成されます。私が欲しいもの

は再びデータベースを触れることなくfollwoingのようなものです:

ta.test.attempts.where(student_id: 100) 

私はちょうど1クエリですべてこれを行うにはどうすればよいですか?

+0

は、 'assign'、' topic'、 'attempt'に必要な' test_'プレフィックスですか?あまりにも多くのことがここで起こっている、それは少し読みにくいです。あなたはER図を載せることができますか? – lusketeer

+0

@lusketeer明快にするためにtest_を削除しました。 – liquorishe

答えて

0

すべての種類の情報を結合したテーブルから取得したいので、最初から結合する必要があります。

Attempt.joins(:topic, :test, :assign)

次に、あなたが最後に、フィールドがあなたが要約

.select("attempts.id as attempt_id, tests.name as test_name, topics.name as topic_name, assigns.created_at as assigned_at")

をしたいstudent_id

.where("attempts.student_id" => 100)

でそれをフィルタリングすることができ

Attempt.joins(:topic, :test, :assign).where("attempts.student_id" => 100).select("attempts.id as attempt_id, tests.name as test_name, topics.name as topic_name, assigns.created_at as assigned_at")

関連する問題