0

好吧,我的第一个项目的主要问题是速度。我不知道在内存和数据库调用之间哪个是哪个。我有两个问题:内存和数据库调用之间的区别

  1. 如何区分数据库调用和内存调用(如果这是它的调用方式)?
  2. 我曾遇到一个指向

    `r.status_messages.last.name` 
    

    所以我测试了它在轨控制台(我这是 我的第一个问题相关的感觉。)

    总之一个未定义的方法错误,

    • r.status_messages.last.name不起作用(读作2级的命令,r.status_messages.last &。名称)
    • BUT, h = r.status_messages.last然后h.name,WORKS
    • 但是,当我这样做,r.status_messages.last.name,它现在工作。
      这里发生了什么?

细节
request_form的has_many status_messages:通过request_statuses
的Rails 3.2.3,Ruby193,Windows 7的教授,NetBeans IDE的6.9.1
Rails的控制台

r = RequestForm.find(25) 
r = RequestForm.find(25) 
    [1m[35mRequestForm Load (1.0ms)[0m SELECT `request_forms`.* FROM `request_forms` WHERE `request_forms`.`id` = ? LIMIT 1 [["id", 25]] 
#<RequestForm id: 25, control_no: 1, requested: true, cds_requested: nil, cds_returned: nil, approval: false, cds_released: nil, cds_recycled: nil, defective_cds: 0, request_date: "2012-05-30", released_date: nil, user_id: 3, admin_id: nil, remarks: nil, created_at: "2012-05-30 07:13:50", updated_at: "2012-05-30 07:13:50"> 
r.status_messages 
r.status_messages 
[#<StatusMessage id: 1, description: "can be edited until sent", user_id: nil, created_at: "2012-05-30 07:31:02", updated_at: "2012-05-30 07:31:02", name: "Created">, #<StatusMessage id: 2, description: "visible to admin", user_id: nil, created_at: "2012-05-30 07:32:51", updated_at: "2012-05-30 07:32:51", name: "Sent">] 
    [1m[36mStatusMessage Load (1.0ms)[0m [1mSELECT `status_messages`.* FROM `status_messages` INNER JOIN `request_statuses` ON `status_messages`.`id` = `request_statuses`.`status_message_id` WHERE `request_statuses`.`request_form_id` = 25[0m 
r.status_messages.last 
r.status_messages.last 
#<StatusMessage id: 2, description: "visible to admin", user_id: nil, created_at: "2012-05-30 07:32:51", updated_at: "2012-05-30 07:32:51", name: "Sent"> 
r.status_messages.last 
.name 
r.status_messages.last 
#<StatusMessage id: 2, description: "visible to admin", user_id: nil, created_at: "2012-05-30 07:32:51", updated_at: "2012-05-30 07:32:51", name: "Sent"> 
.name 
SyntaxError: (irb):6: syntax error, unexpected '.' 
.name 
^ 
     from C:/Ruby193/lib/ruby/gems/1.9.1/gems/railties-3.2.3/lib/rails/commands/console.rb:47:in `start' 
     from C:/Ruby193/lib/ruby/gems/1.9.1/gems/railties-3.2.3/lib/rails/commands/console.rb:8:in `start' 
     from C:/Ruby193/lib/ruby/gems/1.9.1/gems/railties-3.2.3/lib/rails/commands.rb:41:in `<top (required)>' 
     from script/rails:6:in `require' 
     from script/rails:6:in `<main>' 
r.status_messages.last 
.description 
r.status_messages.last 
#<StatusMessage id: 2, description: "visible to admin", user_id: nil, created_at: "2012-05-30 07:32:51", updated_at: "2012-05-30 07:32:51", name: "Sent"> 
.description 
SyntaxError: (irb):10: syntax error, unexpected '.' 
.description 
^ 
     from C:/Ruby193/lib/ruby/gems/1.9.1/gems/railties-3.2.3/lib/rails/commands/console.rb:47:in `start' 
     from C:/Ruby193/lib/ruby/gems/1.9.1/gems/railties-3.2.3/lib/rails/commands/console.rb:8:in `start' 
     from C:/Ruby193/lib/ruby/gems/1.9.1/gems/railties-3.2.3/lib/rails/commands.rb:41:in `<top (required)>' 
     from script/rails:6:in `require' 
     from script/rails:6:in `<main>' 
h = r.status_messages.last 

h = r.status_messages.last 
#<StatusMessage id: 2, description: "visible to admin", user_id: nil, created_at: "2012-05-30 07:32:51", updated_at: "2012-05-30 07:32:51", name: "Sent"> 

h.name 
h.name 
"Sent" 
r.status_messages.last.name 
r.status_messages.last.name 
"Sent" 
r.status_messages.last.description 
r.status_messages.last.description 
"visible to admin" 

编辑:我已经说过这个问题,关于划分到两个查询。对不起,不清楚。

我输入r.status_messages.last.name然后按下进入

但轨道控制台已经削减到r.status_messages.last.name。这导致了语法错误。

namedescription是状态消息的属性。

然而,当我救r.status_messages.last一个变量h

h.nameh.description工作。

令人惊讶的是:之后r.status_messages.last.name也运行良好。

  1. 如何区分数据库调用和内存调用(如果这是它的调用方式)? 我想要一个很好的参考,其中有一个表或比较列表,如.size.length
  2. 是什么导致了这个部门?
+0

请亲自看看你的代码。我敢打赌,你也会看到语法错误消息。 – rubish

+0

我不清楚控制台的所有输出是什么,但是在错误情况下,如“.description”,看起来“.description”是在它自己的行上,这实际上是一个语法错误,如上所示。 –

+0

感谢@rubish,在rails控制台将它切成两半之后,语法当然是错误的。任何想法是什么造成的? –

回答

0
  1. 延迟加载混淆了,我认为时间。这就是为什么我的应用程序有意外的数据库调用不小心调用:count将用sql COUNT查询数据库。您可能需要使用to_a.size
  2. 这是一个nilClass例外。 r.status_messages.last.name没有最后的状态信息。因此,:name为零对象抛出未定义的方法错误。
  3. Netbeans终端似乎是这里的问题,正如@DaveNewton所说的。
相关问题