2016-11-04 3 views
1

Может кто-нибудь эксперт Rails пролить некоторый свет на это поведение в Rails 4:Rails, где запрос терпит неудачу при использовании переменной в запросе

>query_string = "agent_id = '1'" 
=> "agent_id = '1'" 

>Lead.includes('agents').where(query_string).length 
ActiveRecord::StatementInvalid: Mysql2::Error: Unknown column 'agent_id' in 'where clause' 

>Lead.includes('agents').where(agent_id = '1').length 
Lead Load (0.5ms) SELECT `leads`.* FROM `leads` WHERE (1) 
LeadsAssignment Load (0.4ms) SELECT `leads_assignments`.* FROM `leads_assignments` WHERE `leads_assignments`.`lead_id` IN (1, 2, 3, 4, 5) 
Agent Load (0.5ms) SELECT `agents`.* FROM `agents` WHERE `agents`.`id` IN (1, 2) 
=> 5 

Эти два запроса должны быть идентичны. Почему один провал, а другой нет?

Спасибо! Чарли

+1

'Lead.includes ('агенты'). Где (agent_id = '1'). Length' не даже действительный синтаксис и не может работать –

+1

Это действительно, он просто не делает то, что вы ожидаете. Он создает новую переменную под названием «agent_id», присваивая ей «1», а затем используя ее для выполнения 'where ('1')' ..., которая действительна, она просто будет соответствовать каждой строке. – gmcnaughton

+0

@gmcnaughton - это место на. Это должно быть предложено в качестве ответа. – jeffdill2

ответ

2
Lead.includes('agents').where(query_string).length 

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

ActiveRecord::StatementInvalid: Mysql2::Error: Unknown column 'agent_id' in 'where clause' 

У вас нет agent_id в leads Таблица

В то время как

Lead.includes('agents').where(agent_id = '1').length 

Этот синтаксис является неправильным, но запрос возвращает вам некоторые результаты, потому что agent_id = '1' операция присваивания, которая возвращает '1' в where пункт

и запрос, который выполняет это

Lead.includes('agents').where(1).length 

, который вернет вам length всех записей в Lead

запрос должен быть

Lead.includes('agents').where(agent_id: 1).length 

и вам нужно добавить agent_id в таблице проводного

5

Как @Andrey отметил

Lead.includes('agents').where(agent_id = '1').length 

Должно быть написано как:

Lead.includes('agents').where(agent_id: 1).length 

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

EDIT:

Да, только что заметил ошибку. У вас нет agent_id столбец, у вас есть таблица agents, которая имеет (надеюсь) первичный ключ id. Таким образом, ваш запрос должен быть:

Lead.includes('agents').where(agents: { id: 1 }).length 

Или:

Lead.includes('agents').where("agents.id = 1").length 
+0

он никак не отвечает на вопрос :) –

+0

'Lead.includes ('agents'). Where (query_string).length' является действительным, и должен возвращать набор данных, в то время как 'Lead.includes ('агенты'). где (agent_id = '1'). length' недопустим и должен поднять' аргумент WHERE clause' исключение. Вы как-то говорите, у которых есть наоборот, что не имеет смысла. –

+0

Он также работал бы, если бы были 'where (" agent_id = '1' ")'. Запрос должен быть строкой (завернутый в кавычки), чтобы activerecord передавал ее вместе с MySQL. Как и сейчас, это код ruby, а не строка, поэтому Ruby сначала оценивает его. – gmcnaughton

Смежные вопросы