Rails/Ruby 使用计算字段连接

问题描述 投票:0回答:1

我正在尝试弄清楚是否/如何在 where 语句内的计算中使用连接表中的字段。

Plot.joins(:developer)
    .where('plots.reservation_release_date < ?',developer.auto_complete.months.ago)

每个开发者都有一个整数 auto_complete 值。 我不太了解阿雷尔,也不知道如何解决这个问题。 任何帮助表示赞赏

ruby-on-rails ruby arel
1个回答
0
投票

首先,你总是可以使用原始 SQL,例如:

"plots.reservation_release_date < NOW() - interval '1 month' * developer.auto_complete"

但既然你提到并标记了,我也会为此提供一些选项:

用于比较的 Arel 相当简单

Plot.arel_table[:reservation_release_date].lt(VALUE)

复杂性来自于这样一个事实:您似乎需要函数来组装所需的查询。

由于您似乎想要从当前日期中减去

developer.auto_complete
值,我们需要将其转换为 SQL。

例如:

对于 PostgreSQL

condition = Arel::Nodes::Subtraction.new(
              Arel::Nodes::NamedFunction.new('NOW',[]), # NamedFunctions don't include Math 
              Arel::Nodes::UnaryFunction.new(
                'interval', Arel::Nodes.build_quoted('1 month')
              ) * Developer.arel_table[:auto_complete]
)
Plot.joins(:developer).where(Plot.arel_table[:reservation_release_date].lt(condition))

这将导致 SQL 类似于:

SELECT 
  plots.*
FROM
  plots
  INNER JOIN developers ON developers.id = plots.developer_id 
WHERE 
  plots.reservation_release_date < NOW() - interval '1 month' * developer.auto_complete

对于 MSSQL

condition = Arel::Nodes::NamedFunction.new(
             'DATE_ADD',
             [Arel.sql('m'),
              Arel::Nodes::UnaryOperation.new('-',Developer.arel_table[:auto_complete]),
              Arel::Nodes::NamedFunction.new('GETDATE',[]))
Plot.joins(:developer).where(Plot.arel_table[:reservation_release_date].lt(condition))

这将导致 SQL 类似于

SELECT 
  plots.*
FROM
  plots
  INNER JOIN developers ON developers.id = plots.developer_id 
WHERE 
  plots.reservation_release_date < DATEADD(m,-developer.auto_complete,GETDATE())
© www.soinside.com 2019 - 2024. All rights reserved.