2017-02-21 33 views

回答

2

你很少需要下降到在軌撰寫原始SQL(例如,使用find_by_sql方法) - 尤其是對於這樣一個簡單的查詢,因爲這。

相反,你可以像下面和ActiveRecord將正確地將其轉換爲有效的SQL語法您:

# If you are looking for a list of all matching entries: 
Policy.where(acct_ent_date: start_date..end_date) 


# If you only wish to fetch the FIRST matching entry: 
Policy.find_by(acct_ent_date: start_date..end_date) 

這將生成SQL類似如下:

SELECT `policies`.* FROM `policies` WHERE (`policies`.`acct_ent_date` BETWEEN xxxxx AND yyyyy) 

的關鍵問題與您的原始(原始SQL)代碼是,您使用的語法是WHERE IN - 對於多個OR條件,這實際上只是shorthand。由於這不是離散列表(即Array),因此與Rangestart_date..end_date)對象一起使用是沒有意義的。

如果你要嘗試將對象轉換成一個數組,你會看到一個錯誤這樣的:

(start_date..end_date).to_a # => TypeError: can't iterate from Time 
1

只是幫忙別人來這裏:如果你想使用查詢參數與find_by_sql,你需要把所有參數到一個數組,像這樣:

Policy.find_by_sql(["acct_ent_date IN ?", start_date..end_date]) 

我從來沒有真正看到傳遞一個範圍作爲查詢參數,所以我不能對此發表意見,但在一般的「undef錯誤的方法`value_for_database'「錯誤來自於不將參數包裝在數組中。

相關問題