Я пытаюсь написать запрос, который получает все статусы User
и количество этих статусов. Однако мой подход является очень дорогостоящим и сказывается на базе данных, создавая множество запросов.Улучшение производительности моего запроса ActiveRecord
Я до сих пор новичок в этом, и хочу реорганизовать этот код, чтобы он остановил тайм-аут. Ниже приведен код, который я до сих пор: модель
Пользователь:
# app/models/user.rb
class User < ApplicationActiveRecordBase
has_many :purchases
end
Purchase модель:
# app/models/purchase.rb
class Purchase < ApplicationActiveRecordBase
belongs_to :user
end
Схема:
# app/db/schema.rb
create_table "users", force: :cascade do |t|
t.boolean "has_registered"
t.boolean "has_unsubscribed"
end
create_table "purchases", force: :cascade do |t|
t.string "item"
t.integer "price"
t.integer "user_id"
end
код, который я хочу, чтобы оптимизировать:
status = Hash.new(0)
User.find_each do |user|
status[check_user_status(user)] += 1
end
def check_user_status(user)
if user.purchases.count > 0
'purchased'
elsif user.has_registered?
'registered'
elsif user.has_unsubscribed?
'unsubscribed'
end
end
Пожалуйста выкладываю методы 'register_for_account',' 'purchase_something' и has_unsubscribed' если не они столбцы базы данных, тогда вы должны это указать. – karlingen
ваше определение schema.rb и модели действительно помогло бы :) – Anko
Есть ли у вас опция добавить к коду? Если возможно, одним из подходов было бы добавить «enum: status» в вашу модель «Пользователь», которая обновляется, когда пользователь регистрирует, покупает или отменяет подписку. Это немного изменит вашу базу данных, но я думаю, что это будет вполне приемлемая оптимизация, а также сделает ваш код намного понятнее. – Drenmi