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)
这两个查询应该完全相同.为什么一个会失败而另一个不会?
谢谢!查理
正如@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)