在范围内使用find_by_sql会产生错误:未定义的方法'value_for_database';至于;2017年1月1日一串

在范围内使用find_by_sql会产生错误:未定义的方法'value_for_database';至于;2017年1月1日一串,sql,ruby-on-rails,activerecord,Sql,Ruby On Rails,Activerecord,当我试图从一系列日期中搜索时,出现了这个错误 这是我的模型: def self.search(search) if search @policies = Policy.find_by_sql("acct_ent_date IN ?", start_date..end_date) else limit(10) end end 您很少需要在rails中编写原始SQL(例如,使用findby\uSQL方法),尤其是对于这样一个简单的查询 相反,您只需编写以下内容,Acti

当我试图从一系列日期中搜索时,出现了这个错误

这是我的模型:

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

您很少需要在rails中编写原始SQL(例如,使用
findby\uSQL
方法),尤其是对于这样一个简单的查询

相反,您只需编写以下内容,
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条件。这对于使用
范围
开始日期..结束日期
)对象没有意义,因为这不是一个离散列表(即
数组

如果要尝试将对象转换为数组,则会看到如下错误:

(start_date..end_date).to_a # => TypeError: can't iterate from Time
Policy.find_by_sql(["acct_ent_date IN ?", start_date..end_date])

为了帮助其他来到这里的人:如果您想将查询参数与
find_by_sql
一起使用,您需要将所有参数放入一个数组中,如下所示:

(start_date..end_date).to_a # => TypeError: can't iterate from Time
Policy.find_by_sql(["acct_ent_date IN ?", start_date..end_date])

实际上,我从未见过将范围作为查询参数传递,因此我无法对此发表评论,但通常“undefined method`value\u for_database'”错误来自未将参数包装到数组中。

编译时得到的查询是什么?这是问题的正确答案。