Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如何在rails(postgres)查询中参数化日期范围?_Ruby On Rails_Postgresql_Ruby On Rails 5_Rails Activerecord - Fatal编程技术网

Ruby on rails 如何在rails(postgres)查询中参数化日期范围?

Ruby on rails 如何在rails(postgres)查询中参数化日期范围?,ruby-on-rails,postgresql,ruby-on-rails-5,rails-activerecord,Ruby On Rails,Postgresql,Ruby On Rails 5,Rails Activerecord,正如标题所问,如何在查询中包含日期范围 例如,假设我有一个名为VisitToGrandma的模型,它有一个名为visit_date的字段。现在,我想找到上个月所有拜访祖母的经历 以下是我正在尝试的: VisitToGrandma.where("? @> visit_date", (1.month.ago..Time.now)) 但是,这将生成以下查询: “2018-07-07-01”、“2018-07-07-02”、“2018-07-07-02”、“2018-07-07-02”、“201

正如标题所问,如何在查询中包含日期范围

例如,假设我有一个名为VisitToGrandma的模型,它有一个名为visit_date的字段。现在,我想找到上个月所有拜访祖母的经历

以下是我正在尝试的:

VisitToGrandma.where("? @> visit_date", (1.month.ago..Time.now))
但是,这将生成以下查询:

“2018-07-07-01”、“2018-07-07-02”、“2018-07-07-02”、“2018-07-07-02”、“2018-07-07-03”、“2018-07-07-03”、“2018-07-07-03”、“2018-07-07-04”、“2018-07-07-05”、“2018-07-07-06”、“2018-07-07-07-07-08”、“2018-07-07-07-09”、“2018-07-07-07-10”、“2018-07-07-11”、“2018-07-7-11”、“2018-2018-07-07-7-7-7,”2018-7,”2018-07-7-7-7,”2018-11,”2018-2018-07-07-7,”2018-7,”2018-7-7-7-7,”2018-7,”2018-7-7-7 11,”2018-7,”2018-7,”2018-07-07-7,”2018-7,”2018-7-7-7,”2018,”2018-7-7-7 11,”2018-7 7 2018年7月22日,“2018-07-23”、“2018-07-24”、“2018-07-25”、“2018-07-26”、“2018-07-27”、“2018-07-28”、“2018-07-29”、“2018-07-30”、“2018-07-31”、“2018-08-01”访问日期

正确的参数化方法是什么

是的,我知道对于这个虚构的例子,我可以只使用开始日期和结束日期,使用BETWEEN或其他操作符,而不使用实际的日期范围,但这不是我要问的

编辑以指出此问题与以下问题的不同之处:


这个问题只是关于在一个范围内查找一个日期,我的问题是如何实际参数化一个范围对象,以便可以使用postgresql的所有daterange运算符。

似乎您需要滥用一点where占位符来用ActiveRecord实现这一点

VisitToGrandma.where(
  ":range::daterange @> date",
  range: '[2011-01-01,2011-03-01)'
)
注意符号[在范围内,更多关于Postgres doc的信息

似乎您需要滥用一些where占位符来使用ActiveRecord实现这一点

VisitToGrandma.where(
  ":range::daterange @> date",
  range: '[2011-01-01,2011-03-01)'
)
注意符号[在范围内,更多关于Postgres doc的信息

正如我最近在另一个回答中提到的,AR与PostgreSQL范围类型的集成是有限的

您可以通过半手动生成所需范围的字符串表示来解决此问题:

ActiveRecord::Base.connection.type_cast(1.month.ago.to_date .. Time.now.to_date)
不是to_date调用来获取日期而不是时间戳。您也可以说:

today = Date.today
ActiveRecord::Base.connection.type_cast(today.months_ago(1) .. today)
将其与您的查询混合在一起:

today = Date.today
VisitToGrandma.where(
  '? @> visit_date',
  VisitToGrandma.connection.type_cast(today.months_ago(1) .. today)
)
根据上下文的不同,您可能会更容易/更清晰地访问连接。您可能希望包含类型转换,以确保不会误解任何内容:

today = Date.today
VisitToGrandma.where(
  '?::daterange @> visit_date',
  VisitToGrandma.connection.type_cast(today.months_ago(1) .. today)
)

正如我最近在另一个回答中提到的,AR与PostgreSQL范围类型的集成是有限的

您可以通过半手动生成所需范围的字符串表示来解决此问题:

ActiveRecord::Base.connection.type_cast(1.month.ago.to_date .. Time.now.to_date)
不是to_date调用来获取日期而不是时间戳。您也可以说:

today = Date.today
ActiveRecord::Base.connection.type_cast(today.months_ago(1) .. today)
将其与您的查询混合在一起:

today = Date.today
VisitToGrandma.where(
  '? @> visit_date',
  VisitToGrandma.connection.type_cast(today.months_ago(1) .. today)
)
根据上下文的不同,您可能会更容易/更清晰地访问连接。您可能希望包含类型转换,以确保不会误解任何内容:

today = Date.today
VisitToGrandma.where(
  '?::daterange @> visit_date',
  VisitToGrandma.connection.type_cast(today.months_ago(1) .. today)
)

可能是@jvillian的重复,是的,它们是非常相似的问题,但那一个的上下文是没有结果出现,而我的上下文是它正在生成一个错误的查询。”\_ツ_/“认识到上下文的差异,这种方法是否适用?”VisitToGrandma.wherevisit_date:1.月.前..时间.现在?@jvillian,对于这个虚构的例子,是的,但我需要知道如何包含日期范围,以便使用postgresql的所有日期范围运算符,而不仅仅是查找日期是否在这个范围内,我为我的混淆道歉,但你知道吗是指当字段类型为postgres daterange时?可能是@jvillian的重复,是的,它们是非常相似的问题,但该问题的上下文是没有结果出现,而我的上下文是它正在生成错误的查询。'\_ツ_/“认识到上下文的差异,这种方法是否适用?”VisitToGrandma.wherevisit_date:1.月.前..时间.现在?@jvillian,对于这个虚构的例子,是的,但我需要知道如何包含日期范围,以便使用postgresql的所有日期范围运算符,而不仅仅是查找日期是否在这个范围内,我为我的混淆道歉,但你知道吗当字段类型为postgres daterange时是什么意思?当daterange可用并且我们正在处理日期时,为什么要使用tsrange?您可以使用connection.type_cast以适当的格式生成字符串,type_cast还可以正确区分..和..范围。您是对的@muistooshort,daterange是比较da的正确运算符tes,不是时间戳。我会更新我的答案的。谢谢。你介意发布另一个答案和你的建议吗?我想我现有的答案已经足够好了,但请随意更新你的答案。当daterange可用并且我们正在处理日期时,为什么要使用tsrange?你可以使用connection.type\u cast以适当的格式生成字符串,键入_cast还正确区分了..和..范围。你是对的@muistooshort,daterange是比较日期而不是时间戳的正确操作符。我会更新我的答案的。谢谢。你介意发布另一个答案和你的建议吗?我想我现有的答案已经足够好了,但请随时更新你的答案。使用连接n、 你的演员让它很开心。谢谢。 :使用connection.type_cast使它很高兴。谢谢