Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/61.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 为什么';其中';方法进行不必要的数据库调用?_Ruby On Rails_Ruby_Postgresql_Activerecord_Rubymine - Fatal编程技术网

Ruby on rails 为什么';其中';方法进行不必要的数据库调用?

Ruby on rails 为什么';其中';方法进行不必要的数据库调用?,ruby-on-rails,ruby,postgresql,activerecord,rubymine,Ruby On Rails,Ruby,Postgresql,Activerecord,Rubymine,我在Ruby 1.9.3上运行Rails 3.2.10,使用PostgreSQL作为db,使用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 "monkey

我在Ruby 1.9.3上运行Rails 3.2.10,使用PostgreSQL作为db,使用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
为什么要打第二个电话?我怎样才能避免呢

这是Monkey模型的迁移:

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
class
使现代化
我重新启动了服务器,它按照公认的答案运行。

实际上,行
@monkeys=Monkey.where(user\u id:2)
根本不执行SQL查询。它只生成一个
关系
对象:

Monkey.where(user_id: 2).class   #=> ActiveRecord::Relation < Object
Monkey.where(用户id:2).类#=>ActiveRecord::Relation
仅当Rails需要数据时才执行查询,例如,如果您调用
关系上的
中的
.each
.all
.first
.to

如果将
关系
存储在变量
@monkey
中,并且具有类似
@monkey.where(is\u active:true)的内容,则会在代码中首先执行第二个查询,因为
.where(is\u active:true)
部分定义了除存储在
@monkey
中的关系之外的另一个关系


我很确定上面这一行不会进行两次SQL查询。控制器、助手或视图中存在触发第二个查询的内容。您可以在Rails控制台中尝试,如果键入
@monkeys=Monkey,会发生什么情况。其中的where(user\u id:2)
?输出是什么,您的
日志/development.log中记录了什么?

您是否在某个地方定义了默认范围?您是否先发出
exist?
any?
查询,然后再发出
查询?我们需要更多的上下文(控制器代码、视图代码、模型等等),我不担心这一点。SQL的好处在于,您不必担心它是如何实现的。您还可以粘贴模型的代码吗?我刚刚重新启动了服务器,现在它可以按照您所说的那样工作了。谢谢