-1

Ruby 1.9.3 で Rails 3.2.10 を実行しています。PostgreSQL をデータベースとして使用し、RubyMine を使用してコードをデバッグしています。デバッグ中に、次の行に気付きました。

@monkeys = Monkey.where(user_id: 2)

2 つのデータベース呼び出しを行い、次のログを生成します。

Monkey Load (0.6ms)  SELECT "monkeys".* FROM "monkeys" WHERE "monkeys"."user_id" = 2
Monkey Load (1.4ms)  SELECT "monkeys".* FROM "monkeys" WHERE "monkeys"."user_id" = 2 AND "monkeys"."is_active" = 't' LIMIT 1

なぜ2回目の電話?どうすれば回避できますか?

これはモンキー モデルの移行です。

class CreateMonkeys < ActiveRecord::Migration
  def change
    create_table :monkeys do |t|
      t.belongs_to :user, null: false
      t.belongs_to :monkey_template, null: false

      t.boolean :is_redeemed, null: false, default: false
      t.boolean :is_active, null: false, default: true

      t.datetime :activation_time
      t.datetime :expiration_time
      t.datetime :redemption_time
      t.timestamps
    end

    add_index :monkeys, :user_id
  end
end

アップデート

サーバーを再起動しましたが、受け入れられた回答が示唆するように機能します。

4

1 に答える 1

3

実際、この行@monkeys = Monkey.where(user_id: 2)は SQL クエリをまったく実行しません。Relationオブジェクトを生成するだけです:

Monkey.where(user_id: 2).class   #=> ActiveRecord::Relation < Object

クエリは、Rails がデータを必要とする場合にのみ実行されます。たとえば.each、 、.all.firstまたは.to_sを呼び出した場合などですRelation

Relation変数にを格納し、コードに次の@monkeyようなものがある@monkey.where(is_active: true).first場合、2 番目のクエリが実行されます。これは、.where(is_active: true)パーツが に格納されたものに加えて別のリレーションを定義するため@monkeyです。

上記の行で 2 つの SQL クエリが作成されることはないと確信しています。コントローラー、ヘルパー、またはビューに、2 番目のクエリをトリガーする何かがあります。Rails コンソールでそれを試すことができます@monkeys = Monkey.where(user_id: 2)。そこに入力するとどうなりますか? 出力は何ですか? にログインしているのは何log/development.logですか?

于 2013-11-10T12:22:44.473 に答える