В настоящее время я использую .find_by_status (params [: status]) в своих @tasks, чтобы найти задачи, которые не закрыты или липкие. (или 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
Я также скопировал это для своей модели билетов, чтобы найти только открытые билеты на главной странице.
Это также сопровождается этим
<% 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>
Я новичок в рельсах, и я действительно изо всех сил на рефакторинга это. Я бы предпочел сделать эти ссылки в ниспадающем фильтре, но с этим я тоже борюсь.
Любая помощь приветствуется!
Что вы хотите улучшить с помощью рефакторинга? –
Непонятно, что вы хотите, но некоторые комментарии: 1) переменная «status» удерживает 3 (!) Разные значения в ходе метода. Не делай этого. Различные значения заслуживают разных имен. 2) Не записывайте 'then', это не идиоматично. 3) '(4, 5)' Магические числа, вместо этого используйте константы класса. 4) Использовать 'условие? value1: value' для однострочных условий. 5) Не переопределяйте 'find_by_status'! AR автоматически добавляет этот метод. – tokland
Я пошел с приведенным ниже решением и взял на борт классы констант, я написал следующее: Task.where.not (: status => [Task :: CLOSED, Task :: STICKY]) для поиска. Думаю, я должен переименовать его в нечто иное, чем find_by_status? – Callum