Как указать условия для соединенных таблиц в рельсах

Я пытаюсь выполнить запрос в 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, submissions и tasks:

  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

Поэтому я хочу выполнить запрос, где я могу найти все "баллы", которые имеют отношение к конкретной задаче. Представление относится к задачам и счетам.

Теперь мой запрос выглядит так:

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

Ответ 1

Имя в предложении должно быть множественным, чтобы ссылаться на имя таблицы:

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

Ответ 2

Имя предложения должно быть множественным, чтобы ссылаться на имя таблицы.

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

Если оценка имеет много представлений, символ объединения также должен быть множественным, чтобы ссылаться на соотношение между счетом и представлением.

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

Ответ 3

Оговорка: если вы используете нестандартные имена таблиц, вышесказанное не будет выполнено так:

ActiveRecord::StatementInvalid: PG::UndefinedTable: ERROR:  missing FROM-clause entry for table "submissions"

Чтобы исправить это, поместите (joined-model-class).table_name в качестве ключа в хэше, where:

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

Ответ 4

Я считаю, что это проще.

Score.joins(:submission).merge(Submission.where(task_id: 1))

Ответ 5

Ваш запрос выглядит так:

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

Ваши #joins верны, но :submission должно быть множественным:

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