【问题标题】:Difference between memory and database calls内存调用和数据库调用的区别
【发布时间】:2012-05-30 08:48:32
【问题描述】:

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

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

    的未定义方法错误
    `r.status_messages.last.name`
    

    所以我在 Rails 控制台中测试了它(我有一种感觉这是 与我的第一个问题有关。)

    简而言之,
    • r.status_messages.last.name 不起作用(读取为 2 个命令,r.status_messages.last & .name)
    • 但是,h = r.status_messages.last THEN h.name,工作
    • 但是,当我这样做时,r.status_messages.last.name,它现在可以工作了。
      这里发生了什么?

详情
request_form has_many status_messages :通过 request_statuses
Rails 3.2.3、Ruby193、Windows 7 Prof、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然后按下回车

但 Rails 控制台已将其剪切为 r.status_messages.last.name。导致语法错误。

namedescription 是状态消息的属性。

但是,当我将 r.status_messages.last 保存到变量 h

h.nameh.description 工作。

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

  1. 如何区分数据库调用和内存调用(如果它是这样调用的)? 我想要一个很好的参考,其中有一个表格或比较列表,例如.size .length
  2. 造成这种分裂的原因是什么?

【问题讨论】:

  • 请自己好好看看你的代码。我打赌你也会看到语法错误消息。
  • 我不清楚控制台输出是什么,但在错误情况下,例如“.description”,“.description”似乎在自己的行上,这确实是一种语法错误,如图所示。
  • 感谢@rubish,在rails 控制台将其分成两部分后,语法当然是错误的。知道是什么原因造成的吗?
  • @DaveNewton 感谢您的回复,请参阅编辑。
  • @RafaelPerea 没有线索;我曾经使用过的任何 Rails 控制台都不会随机破坏用户输入——如果这是一个 NetBeans 控制台窗口,您的答案可能就在那里。

标签: ruby-on-rails-3 performance has-many-through rails-console


【解决方案1】:
  1. 那段时间延迟加载让我很困惑。这就是为什么我的应用程序有意外的数据库调用。不小心调用:count 将使用sql COUNT 查询数据库。你可能想使用to_a.size
  2. 这是一个 nilClass 异常。 r.status_messages.last.name 中没有最后的状态消息。因此,:name 对一个 nil 对象抛出了一个未定义的方法错误。
  3. @DaveNewton 评论说,Netbeans 终端似乎是这里的问题。

【讨论】:

    猜你喜欢
    • 2014-11-06
    • 2016-08-29
    • 1970-01-01
    • 2018-07-24
    • 1970-01-01
    • 2015-07-01
    • 2020-02-22
    • 2011-08-04
    • 1970-01-01
    相关资源
    最近更新 更多