如何在rails中指定连接表的条件

esp*_*akk 41 sql activerecord ruby-on-rails

我试图在Rails中使用ActiveRecord进行查询,该查询指定了连接表上的某些条件.我似乎无法让它工作,即使我按照这里的例子:

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

指南:

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

我的数据库架构是这样的,有桌子scores,submissionstasks:

  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
Run Code Online (Sandbox Code Playgroud)

所以我想做一个查询,在那里我可以找到与特定任务有关的所有"分数".提交属于任务和分数.

我的查询现在看起来像这样:

Score.joins(:submission).where(:submission => {:task_id => 1})
Run Code Online (Sandbox Code Playgroud)

这会生成以下语法:

SELECT "scores".* FROM "scores" INNER JOIN "submissions" ON "submissions"."score_id" = "scores"."id" WHERE "submission"."task_id" = 1
Run Code Online (Sandbox Code Playgroud)

这会产生以下错误:

SQLite3::SQLException: no such column: submission.task_id
Run Code Online (Sandbox Code Playgroud)

但是有一个列submission.task_id,您可以在db模式中看到它.我可以成功地做到这一点:

SELECT "submissions".* FROM "submissions" WHERE "submissions"."task_id" = 1
Run Code Online (Sandbox Code Playgroud)

Nic*_*ick 65

子句中的名称应该是复数以引用表名:

Score.joins(:submission).where(:submissions => {:task_id => 1})
Run Code Online (Sandbox Code Playgroud)

  • 事实上,根据发布的Rails指南片段,`join'符号也应如此. (3认同)

lea*_*otk 7

子句名称应为复数以引用表名.

Score.joins(:submission).where(submissions: { task_id: 1 })
Run Code Online (Sandbox Code Playgroud)

如果分数有很多提交,则连接符号也应该是复数,以引用分数和提交之间的关系.

Score.joins(:submissions).where(submissions: { task_id: 1 })
Run Code Online (Sandbox Code Playgroud)


the*_*tto 6

我发现这比较容易。

Score.joins(:submission).merge(Submission.where(task_id: 1))
Run Code Online (Sandbox Code Playgroud)


Mat*_*cke 5

一个警告:如果你使用非标准的表名,上面会像这样失败:

ActiveRecord::StatementInvalid: PG::UndefinedTable: ERROR:  missing FROM-clause entry for table "submissions"
Run Code Online (Sandbox Code Playgroud)

要解决此问题,请将其(joined-model-class).table_name作为键放where入哈希中:

Score.joins(:submission).where(
  Submission.table_name => {task_id: 1}
)
Run Code Online (Sandbox Code Playgroud)