Сцепление соединяет столы в рельсах - PullRequest
0 голосов
/ 25 января 2019

Я пытаюсь объединить несколько таблиц вместе и затем сделать запрос, но у меня возникает синтаксическая ошибка.

У меня есть следующие таблицы:

achievement_standards
  id
  description

terms
  start_date
  end_date
  term_year_id

term_standards
  term_id
  achievement_standard_id

И яесть следующий метод:

def school_standards
  @standards = @school.achievement_standards
  .joins("LEFT OUTER JOIN term_standards ON achievement_standards.id = term_standards.achievement_standard_id")
  .joins("LEFT OUTER JOIN terms ON terms.id = term_standards.term_id")
  .where("term_standards.id IS ? OR (term_standards.term_id IS NOT ? AND terms.term_year_id IS NOT ?)", nil, nil, 100),

end

Я получаю syntax error at or near "100".Что-то не так с тем, как я присоединился к столам?Я пытаюсь получить стандарты достижений, которых нет в таблице term_standards, или те, которых нет в таблице term_year 100.

1 Ответ

0 голосов
/ 25 января 2019

Последняя часть вашего запроса:

... AND terms.term_year_id IS NOT ?

Если задан параметр 100, он будет расширен как:

... AND terms.term_year_id IS NOT 100

Это недопустимый SQL: IS isне сравнивать значение с числом, для этого вам нужно использовать оператор равенства (in).Вы, вероятно, хотите:

... AND terms.term_year_id <> ?

В более общем смысле: в большинстве СУБД IS используется только в сочетании с NULL (либо IS NULL, либо IS NOT NULL).Таким образом, в основном этот тип параметризованных выражений может использоваться только с параметром NULL (то есть СУБД вызовет ошибку, если будет передано другое значение):

term_standards.id IS ?
term_standards.term_id IS NOT ?

В зависимости от вашей цели, либо вы не надетывам не нужно использовать параметры (укажите ? явно NULL в вашем запросе), или вы можете захотеть изменить свой запрос.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...