2016-11-04 60 views
1

使用變量時,那裏查詢失敗一些Rails的專家能否對這種行爲在軌道4,5一些輕: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_idleads

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是紅寶石方法和要傳遞一個Ruby散列,其中散列的關鍵是列名稱和值是單元格的值。

編輯:

是的,只是注意到了錯誤。 你沒有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