Objetos de consulta SimpleDelegator e objetos Param

Os aplicativos ficam complicados e antigamente eu colocava toda a minha lógica no modelo, não faça isso aprender o princípio de responsabilidade Única usar objetos de consulta, objetos de parâmetro, etc. Por exemplo, você tem o usuário e deseja colocar relacionado lógica para a classe de usuário em algum lugar é por isso que geralmente crio uma pasta app / modelos / usuários e armazeno a lógica relacionada ao usuário com muitos objetos, por exemplo, um objeto de consulta

module Users
class Query < SimpleDelegator
def initialize(rel = nil)
rel
= User if rel.nil?
super(rel)
end

# In some cases you must use the __getobj__ method
def select_simple
__getobj__
.select('email, first_name')
end

# You can use most of the time all User methods but in some case you will have to use
# __getobj__ for example for select method
def complex_query(search_params={})
params
= Users::SearchParams.new(params) # This line can be improved
joins
(:another_model).where(inscription_date: params.date_start)....
end
#...
end
end

Você pode realmente melhorar Objetos de Consulta com Objetos Param, por exemplo, você quer fazer uma pesquisa e recebe alguns parâmetros como data de início , data de término e pesquisa

class Users::SearchParams
attr_reader
:start_date, :end_date, search

def initialize(attrs = {})
@start_date = get_parsed_date(attrs[:start_date])
@end_date = get_parsed_date(attrs[:end_date])
@search = search_value(attrs[:search])
end

def date_range
date_start
..date_end
end

private


def get_parsed_date(d)
Date.parse(d)
rescue
Date.today
end

def search_value(s = nil)
s
.nil? ? 'default value' : s
end
end

Claro, então você pode usar este Users :: SearchParams em seus objetos de consulta ou em outros lugares onde você precisar, desta forma você manterá suas classes mais limpas.