2013-07-06 2 views
2

Какая из лучших практик и дает мне лучшую производительность?rails3 - лучший код для работы

Например:

У меня есть таблица статусов, которые имеют 5 записей, а каждая запись должна быть хранить на отдельном переменном.

Method1:

@new_status = Status.find_by_status("NEW") 
@inprocess_status = Status.find_by_status("InProcess") 
@completed_status = Status.find_by_status("Completed") 
@occupied_status = Status.find_by_status("Occupied") 
@success_status = Status.find_by_status("Success") 

Method2:

statuses = Status.all 
@new_status = statuses.find {|status| status.status == "NEW"} 
@inprocess_status = statuses.find {|status| status.status == "InProcess"} 
@completed_status = statuses.find {|status| status.status == "Completed"} 
@occupied_status = statuses.find {|status| status.status == "Occupied"} 
@success_status = statuses.find {|status| status.status == "Success"} 

Или anyother хороший способ?

ответ

1

Если существует 5 миллионов записей, метод 1 должен быть лучше, потому что запрос базы данных имеет лучшую производительность.

Если только 5 записей, метод 2 лучше, потому что есть только один запрос к базе данных. Метод 1 имеет 5 запросов, которые очень трудоемки для небольшого количества записей.

1

У вас всего 5 записей, поэтому 5 запросов к базе данных будут очень дорогими, совсем не лучшая практика.

Вы можете получить их в памяти и назначить переменным экземпляра. Но я вижу симметрию в Method2, и она выглядит очень симметрично. Я настоятельно рекомендую не писать симметричный код в ruby, вы можете изменить его с чем-то вроде:

Status.all.each{|status| instance_variable_set("@#{status.name.downcase}_status" , status) } 

Он будет создавать переменные экземпляра и инициализируются переменные экземпляра с соответствующими статусами.

2

Это будет еще более результативно, поскольку он делает только один запрос к БД и получает только необходимое количество данных. Предполагается, что поле status уникально.

statuses = Status.where(
    status: ['NEW', 'InProcess', 'Completed', 'Occupied', 'Success'] 
).order(:status) 

@new_status, @completed_status, @inprocess_status, @occupied_status, @success_status = statuses 
+0

Не собирается ли назначать запись с наименьшим значением «status» на/@ new_status, второй самый низкий до/@ completed_status и т. Д.? Я думаю, вам, возможно, придется переупорядочить последнюю строку. Я бы, наверное, просто проверил количество статусов, чтобы убедиться, что пять найдено. –

+0

'order (: status)' будет убедиться, что они находятся в правильном порядке (который должен быть по возрастанию в алфавитном порядке). Да, я сделал несколько предположений в своем коде, например, этот статус уникален, и эти статусы будут существовать. Цель состояла не в том, чтобы продемонстрировать безупречный пример, цель состояла в том, чтобы предоставить другую, более эффективную альтернативу проблеме OP. – gylaz

Смежные вопросы