Skip to content

Instantly share code, notes, and snippets.

@foxweb
Last active August 29, 2015 14:01
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 1 You must be signed in to fork a gist
  • Save foxweb/e084cfce99245a3e9411 to your computer and use it in GitHub Desktop.
Save foxweb/e084cfce99245a3e9411 to your computer and use it in GitHub Desktop.
# Класс создатель объектов Url и связанных сущностей.
class UrlCreator
attr_reader :url
# Инициирует модель Url на основе полного URL.
#
# @param [String] full_url какой-то URL (http://www.linux.org.ru/forum/talks/8623652)
#
def initialize(full_url)
@url = URI.parse(full_url)
end
def domain
@domain ||= create_domain
end
# Возвращает созданную/найденную модель Domain.
#
# @return [Domain] каскадно созданный или первый найденный Domain
#
def create_domain
Domain.find_or_create_by_hostname(url.host)
end
def url_path
@url_path ||= create_url_path
end
# Возвращает созданную/найденную модель UrlPath.
#
# @return [UrlPath] каскадно созданный или первый найденный UrlPath
#
def create_url_path
UrlPath.find_or_create_by_path(url.path, create_domain)
end
def query_string
@query_string ||= create_query_string
end
# Возвращает созданную/найденную модель QueryString.
#
# @return [QueryString] созданный или первый найденный QueryString
#
def create_query_string
QueryString.create(url_path: create_url_path, value: url.query)
end
# Возвращает созданную/найденную модель Url со всеми прилагающимися сущностями.
#
# @return [Url] созданный или первый найденный Url
#
def create_url(domain, url_path, query_string)
Url.create(
domain: domain,
url_path: url_path.path << url_path.id,
query_string: query_string,
categories: []
)
end
def save
domain = create_domain
url_path = create_url_path
query_string = create_query_string
create_url(domain, url_path, query_string)
end
end
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment