2010-04-02 53 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時得到了什麼......然後將它粘貼到上面的問題中,以便我們看到。