Skip to content

Instantly share code, notes, and snippets.

@rossmari
Last active August 29, 2015 14:15
Show Gist options
  • Save rossmari/3429ea1a24c5cd051d25 to your computer and use it in GitHub Desktop.
Save rossmari/3429ea1a24c5cd051d25 to your computer and use it in GitHub Desktop.
Refactoring example [01]
# === BEFORE REFACTORING
### При добавлении нового региона необходимо также внести информацию о поддомене в файл роутов
module RegionConst
# Местный локатив или второй предложный
LOCATIVE = {"Москва" => "Москве", "Кемерово" => "Кемерово"}
ACCUSATIVE = {"Москва" => "Москвы", "Кемерово" => "Кемерова"}
SUBDOMAINS = Hash[Subdomain.all(:conditions => ['title in (?)', ['Красноярск', 'Омск', 'Новосибирск', 'Абакан', 'Барнаул', 'Москва', 'Кемерово', 'Иркутск', 'Томск', 'Россия', 'Кызыл', 'В мире', 'Чита']]).map{|r| [r.title, r]}]
KRSK = SUBDOMAINS['Красноярск']
OMSK = SUBDOMAINS['Омск']
NSK = SUBDOMAINS['Новосибирск']
ABAKAN = SUBDOMAINS['Абакан']
BARNAUL = SUBDOMAINS['Барнаул']
MOSCOW = SUBDOMAINS['Москва']
KEM = SUBDOMAINS['Кемерово']
IRKUTSK = SUBDOMAINS['Иркутск']
TOMSK = SUBDOMAINS['Томск']
RUSSIA = SUBDOMAINS['Россия']
KYZYL = SUBDOMAINS['Кызыл']
WORLD = SUBDOMAINS['В мире']
CHITA = SUBDOMAINS['Чита']
REGIONS_WITH_TV_NEWS = [KRSK, IRKUTSK, NSK, TOMSK, KEM, OMSK]
class << self
def all_region
@@regions ||= [MOSCOW, KRSK, OMSK, NSK, ABAKAN, BARNAUL, KEM, IRKUTSK, TOMSK, KYZYL, CHITA]
end
def all_regions_for_menu
@@regions_for_menu ||= [RUSSIA, ABAKAN, BARNAUL, IRKUTSK, KEM, KRSK, NSK, OMSK, TOMSK, KYZYL]
end
def subdomains
@@subdomains ||= {
'krsk' => KRSK,
'omsk' => OMSK,
'nsk' => NSK,
'abakan' => ABAKAN,
'barnaul' => BARNAUL,
'fed' => RUSSIA,
'kem' => KEM,
'irkutsk'=> IRKUTSK,
'tomsk' => TOMSK,
'kyzyl' => KYZYL,
'chita' => CHITA
}
end
def regions_for_select
all_region.map{|x| [x.title, x.id]}
end
def get_locative(region)
if region.is_a? Region or region.is_a? Subdomain
LOCATIVE[region.title] || region.title+'е'
else
LOCATIVE[region] || region.to_s+'е'
end
end
def get_accusative(region)
if region.is_a? Region or region.is_a? Subdomain
ACCUSATIVE[region.title] || region.title+'а'
else
ACCUSATIVE[region] || region.to_s+'а'
end
end
end
end
# === AFTER REFACTORING
class RegionConst
# allowed for processing region :marks
ACTIVE_REGIONS = [:krsk, :omsk, :nsk, :abakan, :barnaul, :moscow, :kem, :irkutsk, :tomsk, :russia, :kyzyl, :world]
REGIONS_WITH_TV_NEWS = [:krsk, :irkutsk, :nsk, :tomsk, :kem, :omsk]
class << self
# get all active regions
def all_regions
@@regions ||= get_regions(ACTIVE_REGIONS)
end
# get regions with TV news
def regions_with_tv_news
@@tv_news_regions ||= get_regions(REGIONS_WITH_TV_NEWS)
end
# consider that we trying to get only Active_regions, allow string or symbol
def subdomain(name)
unless name.is_a?(String) || name.is_a?(Symbol)
raise TypeError, 'Subdomain name must be type of String of Symbol'
end
const_get(name.to_s.upcase)
end
# ===
private
def const_missing(name)
set_region_const(name) || super
end
def get_regions(marks)
if marks.is_a? Array
Region.where(mark: marks)
else
Region.find_by_mark(marks)
end
end
def set_region_const(name)
region = get_regions(name.downcase.to_sym)
if region
const_set( name.to_s.upcase , region )
end
end
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment