为什么Rails“触摸”我的所有数据库条目?

时间:2013-06-28 18:54:10

标签: mysql ruby-on-rails-3.2

我正在使用我的本地计算机上的MySQL数据库的Ruby on Rails 3.2应用程序。为了测试我添加的一些新功能,我编写了一个脚本来手动将大约50,000条记录插入到数据库中。到目前为止,非常好。

在添加这些记录后,我第一次使用新功能加载页面时,Rails会加载每个记录,然后一次更新一个记录。这就是我的日志文件:

  (0.1ms)  BEGIN
 MyModel Exists (0.3ms)  SELECT 1 AS one FROM `my_models` WHERE `my_models`.`part_id` = BINARY 1 LIMIT 1
 SQL (0.1ms)  INSERT INTO `my_models` (`answer_date_time`, `call_date_time`, `caller_id`, `part_id`, `created_at`, `destination`, `employee_id`, `end_date_time`, `length`, `part_user_id`, `price`, `routing`, `source`, `updated_at`) VALUES (NULL, '2013-06-28 13:12:06', NULL, 1, '2013-06-28 13:12:06', NULL, 4, NULL, NULL, NULL, NULL, 'incoming', NULL, '2013-06-28 13:12:06')
  (52.6ms)  COMMIT
  (0.0ms)  BEGIN
 MyModel Exists (0.2ms)  SELECT 1 AS one FROM `my_models` WHERE `my_models`.`part_id` = BINARY 2 LIMIT 1
 SQL (0.2ms)  INSERT INTO `my_models` (`answer_date_time`, `call_date_time`, `caller_id`, `part_id`, `created_at`, `destination`, `employee_id`, `end_date_time`, `length`, `part_user_id`, `price`, `routing`, `source`, `updated_at`) VALUES (NULL, '2013-06-28 13:12:06', NULL, 2, '2013-06-28 13:12:06', NULL, 4, NULL, NULL, NULL, NULL, 'outgoing', NULL, '2013-06-28 13:12:06')
  (70.4ms)  COMMIT

依此类推,所有50,000多条记录。花了几分钟才完成。尽管如此,我已经尝试多次重新加载有问题的页面,并且Rails没有再次运行这些查询。

这看起来很正常吗? Rails偶尔需要“捅”一次这样的新记录,然后让它们独自一人吗?或者我的代码看起来有什么问题会导致性能问题?

如果存在潜在问题,我很遗憾不熟悉Rails,而且我从其他人那里继承了这个应用程序。我应该从哪里开始寻找会产生这种行为的代码?

编辑:这是MyModel的定义。我不知道评论意味着什么...

class MyModel < ActiveRecord::Base
  # This model is :dependent => :delete elsewhere
  #  so no :dependents or before/after destroy callbacks without changing other models!
  belongs_to :employee

  validates_uniqueness_of :parts_id

  # snip - class and instance methods
end

编辑2:这是我将记录添加到数据库的方式:

我编写了一个看起来像这样的Ruby脚本create_db_data.rb(这不是真正的脚本,因为我不想分享我公司的代码,但它的工作方式几乎完全相同):

n = 0
for employee in Employee
  for i in (1..10000)
    obj = MyModel.new
    obj.employee_id = employee.id
    obj.answer_date_time = Date.today - i

    n += 1
    obj.part_id = n

    obj.save
  end
end

然后我从命令行执行rails r create_db_data.rb。在此之后,下次我尝试从我的开发机器上的应用程序加载页面时,Rails执行了我正在询问的奇怪查询--Rails没有做任何事情 as 我添加了记录,但之后

1 个答案:

答案 0 :(得分:0)

我最好的猜测是它与validates_uniqueness_of parts_id定义中的MyModel行有关。根据{{​​3}},

  

创建[a]记录[使用validates_uniqueness_of parts_id]时,会执行检查以确保没有   记录存在于数据库中,具有指定的给定值   attribute(映射到列)。当记录更新时,   进行同样的检查,但无视记录本身。

我的猜测是,由于我使用rails r添加了记录而没有正确启动服务器,因此Rails仍然希望在我第一次实际使用Web应用程序中的记录时执行检查。