2010-04-02 68 views
3

在Rails应用程序,我有一个模型,Machine,包含以下命名范围:为什么Rails命名范围返回空(未初始化?)对象?

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

不知道,但在':select'和':group'中,你可以只用'machines。*',不是? – glebm 2010-04-02 19:02:07

+0

你是否检查过由此产生的SQL? – ryeguy 2010-04-09 13:42:11

+0

我有,现在我发布了生成的SQL。 – mipadi 2010-04-09 13:46:58

回答

0

这可能与你正在发生的事情没有关系,但它听起来很相似,所以在这里:你是否在使用rails缓存?

当我尝试缓存查询结果时(与railscast #115相同),我获得了几乎相同的结果。

我追踪到问题仍然open rails bug,使缓存的ActiveRecords不可用 - 你必须选择不使用缓存AR或应用补丁和获取内存泄漏。

缓存对非AR对象起作用,因此我最终将我需要的内容“翻译”为整数和数组,并对其进行缓存。

希望这会有所帮助!

+0

我没有启用缓存,但感谢您的信息。 – mipadi 2010-04-05 19:39:53

0

看起来像分组可能会导致问题。这两个数据在dev &生产中是否也相同?

+0

是的,相同的数据。 – mipadi 2010-04-12 12:13:16

0

嗯,我不确定你有没有你认为你有的问题。

[#<Machine >, #<Machine >] 

意味着你已经在数组上调用了“检查”...但不是在它内部的每个单独的机器对象上。这可能是一个愚蠢的问题,但是您是否真的试过对单个Machine对象进行检查,以便真正查看它们是否在列中为零?

Machine.needs_updates.each do |m| 
    p m.inspect 
end 

如果这确实会导致无列数据。我的下一个建议是,你复制生成的SQL并进入标准的mysql接口,看看你在运行SQL时得到了什么......然后将它粘贴到上面的问题中,以便我们看到。