/ / каква е разликата между преминаване на символ и низ в където клауза с обединения - ruby-on-rails, ruby, ruby-on-rails-3, ruby-on-rails-4

каква е разликата между преминаването на символ и низ, в който е поставена клауза с връзки - рубин на релси, рубин, рубин на релси-3, рубин на релси-4

Имам два модела Потребител и Книга. Потребителят има име и имейл поле, Книга има поле за автор и заглавие. Когато използвам присъединявания, за да накарам потребителите да се базират на свързани данни с условия, които са били прехвърлени в клаузата къде, получавам различни резултати

  1. Когато тичам това

    User.joins(:books).where("author = ? ","xxxx")
    

Генерираната заявка за Mysql е:

 "SELECT `users`.* FROM `users` INNER JOIN `books` ON `books`.`user_id` = `users`.`id` WHERE (author = "xxxxx" )"

ми дава потребителя, чиято книга включва xxxx автор, докато

  1. Когато тичам това

    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"

Можете да проверите връзка за повече информация.