0

Хорошо, моей главной проблемой в моем первом проекте была скорость. Я не знаю, какая из них, между памятью и вызовами базы данных. У меня есть два вопроса:Разница между памятью и вызовами базы данных

  1. Как я могу отличить вызов базы данных от вызова памяти (если это так называется)?
  2. я обнаружил неопределенную ошибку метода, который указывает на

    `r.status_messages.last.name` 
    

    Так что я проверил его в консоли рельсы (у меня было такое чувство, что это , связанные мой первый вопрос.)

    Короче говоря,

    • r.status_messages.last.name не работает (читается как 2 команды, r.status_messages.last & .name)
    • НО, h = r.status_messages.last THEN h.name, WORKS
    • ОДНАКО, когда я это делаю, r.status_messages.last.name, ЭТО РАБОТАЕТ сейчас.
      Что здесь произошло?

детали
request_form has_many status_messages: через request_statuses
Rails 3.2.3, Ruby193, Windows 7 Prof, IDE NetBeans 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" 

EDIT: Я указал, что проблема, касающаяся деления на два запроса. Извините за то, что я не понимаю.

я напечатал r.status_messages.last.nameзатем прессуют на введите

но рельсы консоли перерезал его r.status_messages.last и .name. Это вызвало синтаксическую ошибку.

name и description являются атрибутами сообщения о состоянии.

Однако, когда я спас r.status_messages.last к переменному h

h.name и h.description работал.

И удивительно: r.status_messages.last.name работал отлично, тоже, впоследствии.

  1. Как я могу отличить вызов базы данных от вызова памяти (если это так называется)? Я хочу хорошую ссылку, где есть таблица или список сравнений, например .sizeis to.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 для объекта nil выбрал неопределенную ошибку метода.
  3. Терминал Netbeans, похоже, является проблемой здесь, как прокомментировал @DaveNewton.