当我尝试从一系列日期搜索时出现此错误。
这是我的模型:
def self.search(search)
if search
@policies = Policy.find_by_sql("acct_ent_date IN ?", start_date..end_date)
else
limit(10)
end
end
只是为了帮助其他人来这里:如果您想使用 find_by_sql
使用查询参数,则需要将所有参数放入数组中,例如:
Policy.find_by_sql(["acct_ent_date IN ?", start_date..end_date])
我从未真正看过将范围作为查询参数传递给我,所以我无法对此进行评论,但是通常,"未定义的方法`value_for_database'"错误来自不将参数包装在数组中。
您很少需要下载到在铁轨中编写RAW 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)
您的原始(RAW SQL)代码的关键问题是您使用的是WHERE IN
语法 - 这实际上只是多个或条件的速记。与 Range
(start_date..end_date
)对象一起使用是没有意义的,因为这不是离散列表(即Array
)。
如果要尝试将对象转换为数组,您会看到这样的错误:
(start_date..end_date).to_a # => TypeError: can't iterate from Time