gpt4 book ai didi

sql - 为什么这个 Rails 命名范围返回空(未初始化?)对象?

转载 作者:行者123 更新时间:2023-12-03 17:27:02 25 4
gpt4 key购买 nike

在 Rails 应用程序中,我有一个模型 Machine,它包含以下命名范围:

named_scope :needs_updates, lambda {
{ :select => self.column_names.collect{|c| "\"machines\".\"#{c}\""}.join(','),
:group => self.column_names.collect{|c| "\"machines\".\"#{c}\""}.join(','),
:joins => 'LEFT JOIN "machine_updates" ON "machine_updates"."machine_id" = "machines"."id"',
:having => ['"machines"."manual_updates" = ? AND "machines"."in_use" = ? AND (MAX("machine_updates"."date") IS NULL OR MAX("machine_updates"."date") < ?)', true, true, UPDATE_THRESHOLD.days.ago]
}
}

这个命名范围在开发模式下工作正常。然而,在生产模式下,它会按预期返回 2 个模型,但模型为空或未初始化;也就是说,返回实际对象(不是 nil),但所有字段都是 nil。例如,当在控制台中检查命名范围的返回值时,将返回以下内容:

[#<Machine >, #<Machine >]

但是,如您所见,返回对象的所有字段都设置为nil

生产环境和开发环境本质上是一样的。两者都使用 SQLite 数据库。下面是为查询生成的 SQL 语句:

SELECT
"machines"."id",
"machines"."machine_name",
"machines"."hostname",
"machines"."mac_address",
"machines"."ip_address",
"machines"."hard_drive",
"machines"."ram",
"machines"."machine_type",
"machines"."use",
"machines"."comments",
"machines"."in_use",
"machines"."model",
"machines"."vendor_id",
"machines"."operating_system_id",
"machines"."location",
"machines"."acquisition_date",
"machines"."rpi_tag",
"machines"."processor",
"machines"."processor_speed",
"machines"."manual_updates",
"machines"."serial_number",
"machines"."owner"
FROM
"machines"
LEFT JOIN
"machine_updates" ON "machine_updates"."machine_id" = "machines"."id"
GROUP BY
"machines"."id",
"machines"."machine_name",
"machines"."hostname",
"machines"."mac_address",
"machines"."ip_address",
"machines"."hard_drive",
"machines"."ram",
"machines"."machine_type",
"machines"."use",
"machines"."comments",
"machines"."in_use",
"machines"."model",
"machines"."vendor_id",
"machines"."operating_system_id",
"machines"."location",
"machines"."acquisition_date",
"machines"."rpi_tag",
"machines"."processor",
"machines"."processor_speed",
"machines"."manual_updates",
"machines"."serial_number",
"machines"."owner"
HAVING
"machines"."manual_updates" = 't'
AND "machines"."in_use" = 't'
AND (MAX("machine_updates"."date") IS NULL
OR MAX("machine_updates"."date") < '2010-03-26 13:46:28')

知道出了什么问题吗?

最佳答案

这可能与发生在您身上的事情无关,但听起来很相似,所以这里是:您是否将 Rails 缓存用于任何事情?

当我尝试缓存查询结果时,我得到的结果几乎与您相同(如 railscast #115 中所述)。

我将问题追查到静止 open rails bug这使得缓存的 ActiveRecords 不可用 - 你必须在不使用缓存的 AR 或应用补丁和内存泄漏之间做出选择。

缓存适用于非 AR 对象,所以我最终将我需要的东西“翻译”为整数和数组,并将其缓存。

希望这对您有所帮助!

关于sql - 为什么这个 Rails 命名范围返回空(未初始化?)对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2568551/

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