0

我正在本地机器上使用 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 在我添加记录时没有做任何事情但是之后

4

1 回答 1

0

我最好的猜测是它与' 定义validates_uniqueness_of parts_id中的行有关。MyModel根据该功能的文档

当[使用validates_uniqueness_of parts_id]创建[a]记录时,将执行检查以确保数据库中不存在具有指定属性(映射到列)的给定值的记录。更新记录时,会进行相同的检查,但不考虑记录本身。

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

于 2013-06-28T21:14:44.223 回答