У меня есть два способа сделать похожую вещь, и я хотел бы знать: 1. Что является менее «требовательным» к базе данных ?, 2. Что быстрее ?, 3. Что занимает меньше памяти?, И 4. Если есть какие-то другие вопросы, которые я должен учитывать при сравнении двух.
По сути, у меня есть модель событий, которая имеет множество обменов. Мне нужны обмены для события, отсортированного по типу «длинный» и «короткий». Первый способ выглядит так:
@event.exchanges.each do |ex|
if ex.short == true
@sells << [ex.price, ex.quantity]
else
@buys << [ex.price, ex.quantity]
end
end
Другими способами является установка областей в модели Exchange для коротких и длинных типов и сортировка обменов следующим образом:
@sells = @event.exchanges.shorts
@buys = @event.exchanges.longs
Второй способ более лаконичен и удобен для чтения. Но может показаться, что ActiveRecord дважды «циклически» перебирает все обмены Я использовал первый способ, потому что хотел минимизировать время доступа Rails к базе данных. Но я могу неправильно понять, как работают базы данных. Я также (вслепую) предполагаю, что второй способ занимает больше памяти, когда вы получаете весь объект, когда мне действительно нужны два атрибута от каждого (как дает первый метод).
Я правильно понимаю или нет? Есть ли другие факторы, которые я тоже должен учитывать?
----- Отредактировано в схеме -----
Это схема для моделей Event & Exchange:
create_table "events", :force => true do |t|
t.string "title"
t.text "description"
t.integer "last_price"
t.integer "outcome"
t.boolean "closed"
t.datetime "created_at"
t.datetime "updated_at"
end
create_table "exchanges", :force => true do |t|
t.integer "event_id"
t.integer "user_id"
t.integer "price"
t.integer "quantity"
t.boolean "short"
t.datetime "created_at"
t.datetime "updated_at"
end