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

时间:2010-04-02 18:57:46

标签: sql ruby-on-rails sqlite activerecord named-scope

在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')

任何想法出了什么问题?

3 个答案:

答案 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时得到了什么......然后将它粘贴到上面的问题中,以便我们看到。

相关问题