2012-01-27 7 views
24

ジョイントテーブルの条件を指定するActiveRecordでRailsでクエリを実行しようとしています。そして、私はここからの例に従っていても、それが仕事を得るように見えることはできません。レールでジョインテーブルの条件を指定する方法

http://guides.rubyonrails.org/active_record_querying.html#specifying-conditions-on-the-joined-tables

guides.rubyonrails.org上のガイドから:

Client.joins(:orders).where(:orders => {:created_at => time_range})

私のデータベーススキーマスコア、提出とタスクテーブルで、次のようになります。

create_table "scores", :force => true do |t| 
    t.integer "value" 
    t.integer "user_id" 
    t.datetime "created_at" 
    t.datetime "updated_at" 
    end 

    add_index "scores", ["user_id"], :name => "index_scores_on_user_id" 

    create_table "submissions", :force => true do |t| 
    t.integer "user_id" 
    t.integer "task_id" 
    t.integer "score_id" 
    t.datetime "completed_at" 
    t.datetime "created_at" 
    t.datetime "updated_at" 
    end 

    add_index "submissions", ["score_id"], :name => "index_submissions_on_score_id" 
    add_index "submissions", ["task_id"], :name => "index_submissions_on_task_id" 
    add_index "submissions", ["user_id"], :name => "index_submissions_on_user_id" 

    create_table "tasks", :force => true do |t| 
    t.integer "episode_id" 
    t.integer "score" 
    t.string "key" 
    t.datetime "created_at" 
    t.datetime "updated_at" 
    end 

だから私は、私はspesificタスクに関係を持っているすべての「スコア」を見つけることができますクエリを実行します。投稿はタスクやスコアに属します。

私のクエリは次のようになります。

Score.joins(:submission).where(:submission => {:task_id => 1}) 

これは、次の構文を生成します。

次のエラー発生し
SELECT "scores".* FROM "scores" INNER JOIN "submissions" ON "submissions"."score_id" = "scores"."id" WHERE "submission"."task_id" = 1 

SQLite3::SQLException: no such column: submission.task_id 

をしかし、列submission.task_idがありますこれはdbスキーマで見ることができます。そして、私は正常にこの操作を行うことができます。

SELECT "submissions".* FROM "submissions" WHERE "submissions"."task_id" = 1 

答えて

44

句の名はテーブル名を参照するために、複数の次のようになります。

あなたのクエリは、この

Score.joins(:submission).where(:submission => {:task_id => 1}) 

あなた#joinsのように見えます

Score.joins(:submission).where(:submissions => {:task_id => 1}) 
+2

実際には、Railsのガイドスニペットに掲載されている通り、 'join 'シンボルもそうです。 – Chowlett

+1

あなたはまったく正しい!それだけで私の自己を発見した。ダン。 – espenhogbakk

+0

@Chowlettは、多対多の関係を持っているため、私は1対1、has_one、has_manyのinstadしか持っていません。それは私が思うテーブル名を参考にして複数形をキャッチしなかった理由です。 – espenhogbakk

0

あなたの#where:submissionは複数でなければなりません。

3

警告:非標準のテーブル名を使用している場合、上記は失敗します。

のActiveRecord :: StatementInvalid:PG :: UndefinedTable:ERROR:

Score.joins(:submission).where( Submission.table_name => {task_id: 1} )

:テーブルのFROM句欠落しているエントリ "提出"

この問題を解決するには、どこハッシュでキーとして(joined-model-class).table_nameを置きます

4

表名を参照するには、句名を複数指定する必要があります。

Score.joins(:submission).where(submissions: { task_id: 1 }) 

スコアは多くの応募がある場合は、参加するシンボルもスコアと服従の関係を参照する複数でなければなりません。

Score.joins(:submissions).where(submissions: { task_id: 1 }) 
0

これは簡単です。

Score.joins(:submission).merge(Submission.where(task_id: 1)) 
関連する問題