/ / Refatorar um método para localizar registros por status - ruby-on-rails, ruby, ruby-on-rails-3.2, ruby-on-rails-4

Refatorar um método para localizar registros por status - ruby-on-rails, ruby, ruby-on-rails-3.2, ruby-on-rails-4

Atualmente, uso .find_by_status (params [: status]) em minhas @tasks para encontrar tarefas que não estão fechadas ou que são pegajosas. (4,5).

def self.find_by_status(status)
status = status.to_i
if status == 0 then
status = 1
else
status = status
end
if status == 1 || !status then
Task.where(["STATUS NOT IN (4,5)"])
else
Task.where(:status => status)
end
end

Também copiei isso para o meu modelo de tickets, para encontrar apenas tickets abertos na página inicial.

Também é acompanhado por este

<% status_active = 1 %>
<% Task.new.statuses.each do |status| %>
<li class="<%= if (params[:status].to_i || status_active) == status[0] then "active" end %>">
<%= link_to status[1], :controller => params[:controller], :action => params[:action], :params => { :status => status[0] } %>
</li>

Eu sou novo nos trilhos e estou realmente lutando para refatorar isso. Eu provavelmente preferiria transformar esses links em um filtro de seleção suspensa, mas também luto com isso.

Qualquer ajuda é apreciada!

Respostas:

1 para resposta № 1

Este trecho:

def self.find_by_status(status)
if status.to_i.zero?
Task.where(["STATUS NOT IN (4,5)"])
else
Task.where(:status => status.to_i)
end
end

É idêntico ao código acima (não há como o status ser falso depois que você o lançou to_i).

Você pode limpar o código da visualização para:

<% Task.new.statuses.each do |status| %>
<li class="<%= "active" if (params[:status].to_i || Task::STATUS_ACTIVE) == status[0] %>">
<%= link_to status[1], :controller => params[:controller], :action => params[:action], :params => { :status => status[0] } %>
</li>
<% end %>

Sugiro adicionar STATUS_ACTIVE como uma constante no seu modelo em vez de codificá-lo na exibição.

Além disso, o fato de você estar especificando controladores e ações via param é estranho, mas sem saber mais sobre seu caso de uso, não consigo solucionar isso.