在查询

时间:2016-11-04 12:55:27

标签: ruby-on-rails ruby-on-rails-4

一些Rails专家可以在Rails 4中对这种行为有所了解:

>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

两个查询应该相同。为什么会失败而另一个失败?

谢谢! 查理

2 个答案:

答案 0 :(得分:5)

正如@Andrey指出的那样

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

应写成:

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

因为where是一个ruby方法,并且您正在传递ruby哈希,其中哈希的键是列名,值是单元格的值。

编辑:

是的,只是注意到了这个错误。 您没有agent_id列,您有agents表,其中有一个(希望)主键id。 所以你的查询应该是:

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

或者:

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

答案 1 :(得分: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