在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')
任何想法出了什么问题?
答案 0 :(得分:0)
这可能与你发生的事情没有关系,但听起来很相似,所以在这里:你是否使用rails缓存?
当我尝试缓存查询结果时,我得到的结果几乎与您相同(如railscast #115所述)。
我将问题追溯到静止open rails bug,使缓存的ActiveRecords无法使用 - 您必须在不使用缓存AR或应用补丁并导致内存泄漏之间做出选择。
缓存适用于非AR对象,所以我最终“翻译”了我需要的整数和数组,并缓存了。
希望这有帮助!
答案 1 :(得分:0)
似乎分组可能导致问题。 dev和amp;中的数据是否也相同生产?
答案 2 :(得分:0)
[#<Machine >, #<Machine >]
暗示您已在阵列上调用“inspect”...但不在其中的每个单独的机器对象上调用。这可能是一个愚蠢的问题,但您是否真的尝试在返回的各个Machine对象上调用inspect来查看它们在列中是否有nil?
Machine.needs_updates.each do |m|
p m.inspect
end
如果这确实导致了零列数据。我的下一个建议是你复制生成的SQL并进入标准的mysql界面,看看你在运行那个SQL时得到了什么......然后将它粘贴到上面的问题中,以便我们看到。