Подтвердить что ты не робот

Как передать параметр LEFT JOIN?

** Отредактировано для большей понятности **

** Редактирование переименовано в Документ **

Я хочу, чтобы все пользовательские документы документа с записями на них были предоставлены данным пользователем, и если этот пользователь не проголосовали за какие-либо документы, я все равно хочу получить все документы без голосов. Для egzample:

+------------+--------------+------+
|document.par1|document.par2| vote |
+------------+--------------+------+
|    2       | z            | y    |
|    3       | w            | NULL |
|    4       | x            | NULL |
+------------+--------------+------+

В Ruby on Rails, если я попробовал это:

я. попробуйте:

Document.
   joins("LEFT JOIN `votes` ON `votes`.`v_id` = `document`.`id` AND `votes`.`giver_id` = ?", user_id).
   where('document.creator_id = ?', user_id, .....).
   select('votes.*', `document.param1')

я получил эту ошибку:

RuntimeError in UserDocumentsController#show

unknown class: Fixnum

II. вторая попытка:

Document.
   joins("LEFT JOIN `votes` ON `votes`.`v_id` = `document`.`id`").
   where('document.creator_id = ? AND `votes`.`giver_id` = ?', user_id, user_id, .....).
   select('votes.*', `document.param1')

Возвращает только те записи, которые имеют голоса:

+-------------+-------------+------+
|document.par1|document.par2| vote |
+-------------+-------------+------+
|    2        | z           | y    |
+-------------+-------------+------+

Таким образом, отсутствует 2 записи.

** Обновлено, это решение работает **

III. Моя третья попытка, спасибо за помощь Mischa:

Document.
   joins("LEFT JOIN `votes` ON `votes`.`v_id` = `document`.`id`").
   where('document.creator_id = ? AND (`votes`.`giver_id` = ? OR  `votes`.`giver_id` IS NULL)', user_id, user_id).
   select('votes.*', `document.param1')

+-------------+-------------+------+
|document.par1|document.par2| vote |
+-------------+-------------+------+
|    2        | z           | y    |
|    3        | w           | NULL |
|    4        | x           | NULL |
+-------------+-------------+------+
4b9b3361

Ответ 1

Это даст вам набор результатов, который вам нужен:

Document.
   joins("LEFT JOIN `votes` ON `votes`.`v_id` = `document`.`id`").
   where('document.creator_id = ? AND (`votes`.`giver_id` = ? OR  `votes`.`giver_id` IS NULL)', user_id, user_id).
   select('votes.*', `document.param1')

Ответ 2

Условие условия не должно появляться в joins.

Это должно работать:

Myclass.
  joins("LEFT JOIN `votes` ON `votes`.`v_id` = `myclass`.`id`").
  where('myclass.creator_id = ? AND `votes`.`giver_id` = ?', user_id, user_id, .....).
  select('votes.*', `myclass.param1')

Ответ 3

У меня была такая же проблема, но, похоже, она не работает, и я нашел один способ, который решает это, объявляя строковую переменную и передавая условия "ON" этой строке и ссылаясь на это в команде SQL.

Например: on_condition = "(votes.giver_id ="+user_id+")"

И команда:

Myclass.joins("LEFT JOIN votes).on(on_condition).where('myclass.creator_id = ?', user_id).select('votes.*', myclass.param1)