在范围内使用 find_by_sql 会产生错误:未定义的方法"value_for_database"表示"2017-01-01":String



当我尝试从一系列日期搜索时出现此错误。

这是我的模型:

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

最新更新