Приятней работать параметры


if params[:package]
  city_ids = []

  city = params[:package].delete 'city'
  city_ids << city  if city.to_i > 0

  cities = params[:package].delete 'cities'
  city_ids += cities  if cities.class == Array && cities.length > 0

  params[:package][:cities] = city_ids.map{ |c| City.get(c) }.compact
end


256
4
задан 20 апреля 2011 в 10:04 Источник Поделиться
Комментарии
1 ответ

Этот код выглядит довольно чистым. Вот несколько мыслей:

Я не уверен, что ваш ОЗР (или даже то, что город является база данных резервное), но большинство есть способ, чтобы принести более одной записи за раз. Сделав один звонок позволит сэкономить время и ресурсы базы данных.

Еще одна мысль заключается в том, что вы не наводить много местных Варс: city_ids, города, городов. Что о попытке создать массив идентификаторов в параметр params[:пакет][:города]? например

#if cities is not an array, it is bad date get rid of it.
params[:package].delete 'cities' unless params[:package][:cities].kind_of? Array
params[:package][:cities] ||= []
params[:package][:cities] << (params[:package].delete 'city') if params[:package][:cities].to_i > 0
params[:package][:cities] = params[:package][:cities].map{ |c| City.get(c) }.compact

Приведенный выше код, кажется, не очень сухой, потому что она имеет все эти параметры [пакет] вещи. Если вы делаете вещи, как это много (ваш вопрос звучит, как вы делаете) фактор операцию в отдельный метод:

def extract_nested_reference(hash,values) # change name as appopriate
if hash
hash.delete values unless hash[values].kind_of? Array
hash[values] ||=[]
hash[values] << hash[values.singularize] if hash[values.singularize].to_i > 0

hash[values] = hash[values].map do |x|
Object.const_get(values.singularize.constantize).get(c)
end.compact
end
end

Этот метод может быть вызван с extract_nested_reference(параметр params[:пакет],'города'). Рефакторинг, как это будет стимулировать вас, чтобы быть последовательными в том, как вы строите вы слово params хэш, и позволяют повторно использовать код.

Наконец, ваш вопрос о лучших способов борьбы с хэшами. Я не думаю, что есть. Вы найдете код очень похож на этот, живущие в самых популярных самоцветов. Как вы говорите, это своего рода неуклюжим, а следовательно и отличный кандидат на редактор кода.

3
ответ дан 21 апреля 2011 в 03:04 Источник Поделиться