我正在尝试弄清楚是否/如何在 where 语句内的计算中使用连接表中的字段。
Plot.joins(:developer)
.where('plots.reservation_release_date < ?',developer.auto_complete.months.ago)
每个开发者都有一个整数 auto_complete 值。 我不太了解阿雷尔,也不知道如何解决这个问题。 任何帮助表示赞赏
首先,你总是可以使用原始 SQL,例如:
"plots.reservation_release_date < NOW() - interval '1 month' * developer.auto_complete"
但既然你提到并标记了arel,我也会为此提供一些选项:
用于比较的 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())