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.