2017-02-21 8 views
0

このエラーは、日付の範囲から検索しようとしたときに表示されました。 - 特に、このような単純なクエリのためにあなたはめったに(例えばfind_by_sqlメソッドを使用して)、レールに生のSQLを書くことにドロップダウンする必要はありません範囲内でfind_by_sqlを使用すると、エラーが発生します:未定義のメソッド「value_for_database」for「2017-01-01」:

def self.search(search) 
    if search 
    @policies = Policy.find_by_sql("acct_ent_date IN ?", start_date..end_date) 
    else 
    limit(10) 
    end 
end 
+0

コンパイル時にどのようなクエリが表示されますか? –

答えて

2

は、これは私のモデルです。代わりに

、あなただけの次のように記述することができますし、ActiveRecordが正しくあなたのための有効なSQL構文に変換します:

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

キー問題:これは、次のような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)コードでは、WHERE INという構文が使用されています。これは複数のOR条件に対して実際にはshorthandです。 Rangestart_date..end_date)オブジェクトは、離散リスト(Array)ではないため、これを使用することは意味がありません。

あなたは配列にあなたのオブジェクトを変換しようとした場合、あなたはこのようなエラーに何か見るであろう。ただ、誰がここに来て手伝って

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

を:あなたがして、クエリのparamsを使用したい場合

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

私は実際にクエリパラメータとして範囲を渡して見たことがないので、私はそれにコメントすることはできませんが、中:find_by_sqlは、あなたはこのように、配列にすべての引数を配置する必要があります一般的には "undef inedメソッド `value_for_database '"のエラーは、引数を配列にラップしないことに起因します。

関連する問題