gpt4 book ai didi

ruby-on-rails - Rails 为左连接模型命名范围

转载 作者:行者123 更新时间:2023-11-29 12:46:40 28 4
gpt4 key购买 nike

我有一个名为 acts 的表,我想运行一个查询来汇总整个星期的 act 值。我想确保查询总是为一周中的每一天返回一行,即使那天没有记录。现在我是这样做的:

  def self.this_week_totals
sunday = Time.now.beginning_of_week(:sunday).strftime("%Y-%m-%d")
connection.select_values(<<-EOQ)
SELECT COALESCE(SUM(end_time - start_time), '0:00:00') AS total_time
FROM generate_series(0, 6) AS s(t)
LEFT JOIN acts
ON acts.day = '#{sunday}'::date + s.t
WHERE deleted_at IS NULL
GROUP BY s.t
ORDER BY s.t
EOQ
end

有什么方法可以使它成为 Act 类的命名范围,以便它可以与其他条件结合使用,例如通过 client_id 过滤 Acts?由于 acts 不在我的 FROM 中,而是 LEFT JOIN 的一部分,我猜不是,但也许有人知道一种方式。

编辑:澄清一下,此方法的目标是始终恰好返回 7 个 Act 对象,而不管数据库中有什么。

最佳答案

如果你希望你的查询对象是可链接的,它必须是一个 ActiveRelation 对象

whereselectorder 和其他 Arel 对象返回可链接的 ActiveRelation 对象,因此如果以下内容有效,您可以链接返回查询对象的

请注意,在 Rails 3 及更高版本中,有一个返回 ActiveRelation 的类方法基本上与作用域相同,它们都是可链接的查询对象

class Act
def self.this_week_totals
sunday = Time.now.beginning_of_week(:sunday).strftime("%Y-%m-%d")
select("COALESCE(SUM(end_time - start_time), '0:00:00') AS total_time")
.from("generate_series(0, 6) AS s(t)")
.joins("LEFT JOIN acts ON acts.day = '#{sunday}'::date + s.t")
.where("deleted_at IS NULL")
.group("s.t")
.order("s.t")
end
# ...
end

client_id = params[:client_id]
Act.this_week_totals.where("client_id = ?", client_id)

http://api.rubyonrails.org/classes/ActiveRecord/QueryMethods.html#method-i-from

关于ruby-on-rails - Rails 为左连接模型命名范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17257539/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com