2012-08-28 55 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