0

さて、私の最初のプロジェクトでの私の主な問題はスピードでした。メモリ呼び出しとデータベース呼び出しのどちらがどちらかわかりません。2つの質問があります:

  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_formhas_manystatus_messages:through request_statuses
Rails 3.2.3、Ruby193、Windows 7 Prof、NetBeans IDE6.9.1Rails
コンソール

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"

編集:2つのクエリへの分割に関して、私はその問題を述べました。はっきりしないのでごめんなさい。

入力してEnterr.status_messages.last.name キーを押しました

しかし、Railsコンソールはそれをr.status_messages.lastとにカットしていました.name。これが構文エラーの原因でした。

nameおよびdescriptionはステータスメッセージの属性です。

r.status_messages.lastただし、変数に保存するとh

h.nameh.description働いた。

そして驚くべきr.status_messages.last.nameことに、その後もうまくいきました。

  1. データベース呼び出しとメモリ呼び出しをどのように区別できますか(そのように呼び出された場合)? のように、比較の表またはリストがある、良い参照.size が必要 .lengthです。
  2. この分裂の原因は何ですか?
4

1 に答える 1

0
  1. 遅延読み込みは、当時私を混乱させていました。そのため、私のアプリでは予期しないデータベース呼び出しが発生しました。不注意に呼び出す:countと、SQLCOUNTを使用してデータベースにクエリが実行されます。を使用することをお勧めしますto_a.size
  2. これはnilClassの例外でした。に最後のステータスメッセージはありませんでしたr.status_messages.last.name。したがって、:namenilオブジェクトに対して、未定義のメソッドエラーがスローされました。
  3. @DaveNewtonがコメントしているように、ここではNetbeans端末が問題のようです。
于 2014-06-11T03:00:08.943 に答える