2012-08-28 56 views
1

背景資料:
型號:App和公告
協會:應用程序的has_many公告奇怪的空?行爲的Rails 3.2.8

情況: 我在AnnouncementsController

def index 
    app = App.find(params[:app_id]) 
    @announcements = app.announcements 
end 

我一個非常簡單的索引操作使用jbuilder gem來輸出json,它表明我的@announcements數組是空的,但我確定我有記錄。我查了一下資料來源,發現它使用了'空'?方法在繼續之前檢查集合是否爲空。我想看看'空'?方法返回所以我加了一行index動作:

def index 
    app = App.find(params[:app_id]) 
    @announcements = app.announcements 
    puts @announcements.empty?.to_s # Returns: "true" 
end 

「真」不是我所期待的,因爲我相信我有數據。因此,我添加了一個'檢查'電話來檢查@announcement變量中的內容:

def index 
    app = App.find(params[:app_id]) 
    @announcements = app.announcements 
    puts @announcements.inspect # Returns: "[#<Announcement id: 1, app_id: 1, title: \"20% off everything!\", content: \"Enjoy 20% off everything from now until yesterday!!...\", image: \"0e06b94d-1ac6-4d90-b937-9fa7bfaf90c9.jpg\", status: 0, created_at: \"2012-08-27 15:33:00\", updated_at: \"2012-08-27 15:33:00\">]" 
    puts @announcements.empty?.to_s # Returns: "false" 
end 

嗯......有趣。因此,除了向我的變量添加「檢查」之外,沒有任何更改,「空?」方法返回了不同的結果。

我做了另一個有趣的現象是,如果我這樣做,而不是:

def index 
    @announcements = Announcement.all 
    puts @announcements.empty?.to_s # Returns: "false" 
end 

的「空?」工作得很好。

其他人是否有同樣的問題,還是隻是我?

回答

0

Rails以一種懶惰的方式加載集合,所以當你檢查它加載它不再是空的。

+0

嗯..我明白了......但我不想在那裏進行無意義的檢查,那麼這樣做的正確方法是什麼? – mountriv99

+0

試試'@announcements = app.announcements.all'。 –

+0

如果您只是想要更改此查詢或在模型上設置默認值,則您必須在cab中執行include操作。檢查這個問題的更多信息如何做到這一點:http://stackoverflow.com/questions/2042507/rails-eager-loading-on-all-finds – Migore