ActiveRecord assign_attributes非常慢

时间:2015-12-10 23:00:17

标签: ruby-on-rails activerecord

我使用的是Ruby 2.2.1和Rails 4.2.0

我的Rails应用程序上有一个方法可以从Web服务中存储数据。检索并格式化数据后,我先使用assign_attributes更新模型,然后再执行其他逻辑并保存。问题是分配变量是疯狂的!分配3个属性(一个字符串和两个布尔值)需要1到3秒。我的完整应用程序需要分配30,并且每个对象的更新时间超过一分钟。

示例代码:

...

# @trips_hash is a hash of { trip_numbers => trip_details<Hash> }
# @bi_trips is an array of <Trip> (ActiveRecord::Base) objects from the database

@trips_hash.each do |trip_number, trip_details|
  trip = @bi_trips.select { |t| t.number == trip_number }.first
  ...
  time_started = Time.now # For performance profiling
  trip.assign_attributes( stage: 'foo', all_intl: true, active: false )
  p "Done in #{(Time.now - time_started).round(2)} s."
end

...

以下是上述代码的结果:

"Done in 0.0 s."
"Done in 1.71 s."
"Done in 2.09 s."
"Done in 3.36 s."
"Done in 1.45 s."
"Done in 1.99 s."
"Done in 1.63 s."
"Done in 0.59 s."
"Done in 1.61 s."
"Done in 1.56 s."
"Done in 2.25 s."
"Done in 1.42 s."
"Done in 1.53 s."
"Done in 1.61 s."

我疯了吗?似乎不应该花1-3秒来分配对象的3个属性。我得到了类似的结果,将其分解为

trip.stage = 'foo'
trip.all_intl = false
trip.active = true

0 个答案:

没有答案