Sql 为什么这个Rails命名的作用域返回空(未初始化?)对象?

Sql 为什么这个Rails命名的作用域返回空(未初始化?)对象?,sql,ruby-on-rails,sqlite,activerecord,named-scope,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(','), :joi

在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]
  }
}
但是,正如您所看到的,返回的对象的所有字段都设置为
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')
选择
“机器”。“id”,
“机器”“机器名称”,
“计算机”“主机名”,
“计算机”“mac_地址”,
“计算机”“ip_地址”,
“机器”“硬盘”,
“机器”“内存”,
“机器”“机器类型”,
“机器”“使用”,
“机器”“注释”,
“机器”“正在使用”,
“机器”“模型”,
“计算机”“供应商id”,
“机器”“操作系统\u id”,
“机器”“位置”,
“机器”“购置日期”,
“机器”“rpi_标签”,
“机器”“处理器”,
“机器”,“处理器速度”,
“机器”“手动更新”,
“机器”“序列号”,
“计算机”“所有者”
从…起
“机器”
左连接
“机器更新”上的“机器更新”。“机器id”=“机器”。“id”
分组
“机器”。“id”,
“机器”“机器名称”,
“计算机”“主机名”,
“计算机”“mac_地址”,
“计算机”“ip_地址”,
“机器”“硬盘”,
“机器”“内存”,
“机器”“机器类型”,
“机器”“使用”,
“机器”“注释”,
“机器”“正在使用”,
“机器”“模型”,
“计算机”“供应商id”,
“机器”“操作系统\u id”,
“机器”“位置”,
“机器”“购置日期”,
“机器”“rpi_标签”,
“机器”“处理器”,
“机器”,“处理器速度”,
“机器”“手动更新”,
“机器”“序列号”,
“计算机”“所有者”
有
“机器”。“手动更新”=“t”
和“机器”,“正在使用”=“t”
和(MAX(“机器更新”,“日期”)为空
或MAX(“机器更新”“日期”)<'2010-03-26 13:46:28')

你知道哪里出了问题吗?

这可能与发生在你身上的事情无关,但听起来很相似,所以这里是这样的:你在使用rails缓存做任何事情吗

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

我找到了一个使缓存的ActiveRecords无法使用的问题——你必须在不使用缓存的AR或应用补丁和内存泄漏之间做出选择

对于非AR对象,缓存可以正常工作,因此我最终将需要的内容“转换”为整数和数组,并将其缓存


希望这有帮助

似乎是分组导致了问题。开发和生产中的数据是否相同

嗯,我不确定你是否有你认为存在的问题

[#<Machine >, #<Machine >]
?


如果这确实导致零列数据。我的下一个建议是复制生成的SQL并进入标准mysql界面,看看运行该SQL时会得到什么。。。然后将其粘贴到您上面的问题中,这样我们就可以看到。

不知道,但是在
:选择
:组
中,您可以只做
机器。*
,否?您检查过由此生成的SQL吗?我检查过,现在我已经发布了生成的SQL。
[#<Machine >, #<Machine >]
Machine.needs_updates.each do |m|
  p m.inspect
end