【问题标题】:Arel query where a value is between two columnsArel 查询值在两列之间的位置
【发布时间】:2018-06-15 13:56:26
【问题描述】:

我想在 ActiveRecord/Arel 中编写一个查询(没有对 SQL 进行硬编码)测试日期是否在两列之间:例如WHERE input_date BETWEEN some_table.column_1 AND some_table.column_2。我尝试了以下方法:

between_query = Arel::Nodes::Between.new(
  Time.zone.now,
  Arel::Nodes::And.new(
    [
      arel_table[:column_1],
      arel_table[:column_2]
    ]
  )
)
where(between_query)

但我收到错误 Arel::Visitors::UnsupportedVisitError: Unsupported argument type: Time. Construct an Arel node instead.

【问题讨论】:

  • 出于好奇,您为什么不使用老式的 AR where 声明?

标签: ruby-on-rails rails-activerecord arel


【解决方案1】:

您可以尝试改为构造一个 Arel 节点

between_query = Arel::Nodes::Between.new(
  Arel::Nodes::Quoted.new(Time.zone.now),
  Arel::Nodes::And.new(
    [
      arel_table[:column_1],
      arel_table[:column_2]
    ]
  )
)
where(between_query)

【讨论】:

  • 您也可以通过Arel.sql("'#{Time.zone.now}'")进行操作
【解决方案2】:

您需要将Time.zone.now 替换为某种SQL 节点。如果您只是想查看当前时间是否在两列之间,这应该可以:

between_query = Arel::Nodes::Between.new(
  Arel.sql('current_date'),
  Arel::Nodes::And.new(
    [
      arel_table[:column_1],
      arel_table[:column_2]
    ]
  )
)
where(between_query)

否则,如果您尝试传入可变时间,而不是 Arel.sql('current_date'),请将其替换为 Arel::Nodes::Quoted.new(Time.zone.now.to_s(:db))

【讨论】:

    猜你喜欢
    • 2021-10-31
    • 2017-01-13
    • 2015-09-13
    • 2021-11-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多