0

ローカル マシンで MySQL データベースを使用する Ruby on Rails 3.2 アプリに取り組んでいます。追加した新しい機能をテストするために、データベースに約 50,000 レコードを手動で挿入するスクリプトを作成しました。ここまでは順調ですね。

これらのレコードを追加した後、新しい機能を含むページを初めてロードしたとき、Rails は各レコードをロードしてから、一度に 1 つずつ更新しました。これは私のログファイルがどのように見えるかです:

  (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 は私が求めている奇妙なクエリを実行まし

4

1 に答える 1

0

私の最善の推測は、の定義のvalidates_uniqueness_of parts_id行と関係があるということです。関数のドキュメントにMyModelよると、

[a] レコードが [を使用してvalidates_uniqueness_of parts_id] 作成されると、指定された属性 (列にマップされる) に指定された値を持つレコードがデータベースに存在しないことを確認するためのチェックが実行されます。レコードが更新されると、同じチェックが行われますが、レコード自体は無視されます。

私の推測ではrails r、サーバーを適切に起動せずにレコードを追加したため、Rails は Web アプリケーションで実際にレコードを初めて使用したときにチェックを実行したかったのです。

于 2013-06-28T21:14:44.223 に答える