Новичок в rails / ruby (используется rails 3 и ruby 1.9.2), и я пытаюсь избавиться от некоторых ненужных выполняемых запросов.
Когда я бегу, каждый делает:
apples.to_a.each do |apple|
new_apple = apple.clone
new_apple.save!
end
и я проверяю sql LOG, я вижу три оператора выбора, за которыми следует один оператор вставки. Выбранные утверждения кажутся совершенно ненужными. Например, они что-то вроде:
ВЫБРАТЬ Fruit. * Из Fruits, где Fruit.ID = 5 LIMIT 1;
ВЫБЕРИТЕ Цвет. * Из Цветов, где Color.ID = 6 LIMIT 1;
SELECT TreeType. * Из TreeTypes, где TreeType.ID = 7 LIMIT 1;
ВСТАВИТЬ в значения Apple (Fruit_id, color_id, treetype_id) (6, 7, 8) ВОЗВРАЩАЯСЯ "id";
Похоже, это не займет много времени, но когда у меня будет 70 000 вставок, я держу пари, что эти три выбора для каждой вставки займут приличное количество времени.
Так что мне интересно следующее:
- Это типично для ActiveRecord / Rails .save! метод, или предыдущий разработчик добавил какой-то собственный код?
- Могут ли эти три оператора выбора, выполняемые для каждого элемента, вызвать заметное дополнительное время?
- Если он встроен в rails / active record, легко ли его обойти, если это сделает его более эффективным?