在查询中使用变量时查询失败的Rails

cha*_*iez 1 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
Run Code Online (Sandbox Code Playgroud)

这两个查询应该完全相同.为什么一个会失败而另一个不会?

谢谢!查理

Mag*_*uss 5

正如@Andrey指出的那样

Lead.includes('agents').where(agent_id = '1').length
Run Code Online (Sandbox Code Playgroud)

应该写成:

Lead.includes('agents').where(agent_id: 1).length
Run Code Online (Sandbox Code Playgroud)

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

编辑:

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

Lead.includes('agents').where(agents: { id: 1 }).length
Run Code Online (Sandbox Code Playgroud)

要么:

Lead.includes('agents').where("agents.id = 1").length
Run Code Online (Sandbox Code Playgroud)