Имам два модела Потребител и Книга. Потребителят има име и имейл поле, Книга има поле за автор и заглавие. Когато използвам присъединявания, за да накарам потребителите да се базират на свързани данни с условия, които са били прехвърлени в клаузата къде, получавам различни резултати
Когато тичам това
User.joins(:books).where("author = ? ","xxxx")
Генерираната заявка за Mysql е:
"SELECT `users`.* FROM `users` INNER JOIN `books` ON `books`.`user_id` = `users`.`id` WHERE (author = "xxxxx" )"
ми дава потребителя, чиято книга включва xxxx автор, докато
Когато тичам това
User.joins(:books).where(author: "xxxx")
Генерираната заявка за Mysql е:
"SELECT `users`.* FROM `users` INNER JOIN `books` ON `books`.`user_id` = `users`.`id` WHERE `users`.`author` = "xxxx"">
дава Mysql2 :: Грешка: Неизвестна колона "users.author" в "where clause":
SELECT `users`.* FROM `users` INNER JOIN `books` ON `books`.`user_id` = `users`.`id` WHERE `users`.`author` = "xxxx"
ActiveRecord :: StatementInvalid: Mysql2 :: Грешка: Неизвестна колона "users.author" в "where clause": SELECT users
. * FROM users
ВЪВЕЖДАНЕ book
ON book
.user_id
= users
.id
КЪДЕТО users
.author
= "Дан Браун"
Въпросът ми : е, когато преминавам в низово капсулирано полеи стойност в където клауза ми дава резултат, но когато премине символ в където клауза ми дава MySQL неизвестна грешка колона. Така че как ruby интерпретатор знае от къде да извлича данни в символ преминаване и низ преминаване
Отговори:
3 за отговор № 1Когато се присъединим към масите, особено в релсите, релсите имат сила да вземат псевдонима на съединените маси.
Вашата заявка,
User.joins(:books).where(author: "xxxx")
търси полето за автор в полето потребителска таблица
User.joins(:books).where(author: "xxxx")
винаги взема полето от първата таблица и
User.joins(:books).where("author = ? ","xxxx")
търсения в двете таблици
Например, User.joins(:books).where("id = ? ","xxxx")
, опитайте тази заявка.
В горното ще получите грешка, защото id
полето присъства и в двете таблици и става объркано
но,
User.joins(:books).where(id: "xxxx")
работи, защото търси само в таблицата с потребители.
така че, можете да използвате, посочете автора чрез книги books: {author: "xxxx"}
User.joins(:books).where(books: {author: "xxxx"}) // your required query
или
User.joins(:books).where("author = ? ","xxxx")
-1 за отговор № 2
User.joins(:books).where("author = ? ","xxxx")
е свободен от sql инжекция, но User.joins(:books).where(author: "xxxx")
не е .
Добре е да се използва User.joins(:books).where("author = ? ","xxxx")
тъй като е по-лесно да се напише по-сложна клауза.
Когато пишете User.joins(:books).where(author: "xxxx")
интерпретатора на релсите ще се опита да интерпретира като users.author = "xxxx"
Можете да проверите връзка за повече информация.