2013-07-30 2 views
0

В настоящее время я использую .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> 

Я новичок в рельсах, и я действительно изо всех сил на рефакторинга это. Я бы предпочел сделать эти ссылки в ниспадающем фильтре, но с этим я тоже борюсь.

Любая помощь приветствуется!

+0

Что вы хотите улучшить с помощью рефакторинга? –

+0

Непонятно, что вы хотите, но некоторые комментарии: 1) переменная «status» удерживает 3 (!) Разные значения в ходе метода. Не делай этого. Различные значения заслуживают разных имен. 2) Не записывайте 'then', это не идиоматично. 3) '(4, 5)' Магические числа, вместо этого используйте константы класса. 4) Использовать 'условие? value1: value' для однострочных условий. 5) Не переопределяйте 'find_by_status'! AR автоматически добавляет этот метод. – tokland

+0

Я пошел с приведенным ниже решением и взял на борт классы констант, я написал следующее: Task.where.not (: status => [Task :: CLOSED, Task :: STICKY]) для поиска. Думаю, я должен переименовать его в нечто иное, чем find_by_status? – Callum

ответ

1

Этот фрагмент кода:

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 

идентична вашей выше коде (Там нет никакого способа, что статус может быть ложным после того, как вы бросили его to_i).

Вы можете очистить код вида вниз:

<% 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 %> 

Я предлагаю добавить STATUS_ACTIVE как константа в модели вместо кодирования его в поле зрения.

Кроме того, факт, что вы указываете контроллеры и действия с помощью параметра, является странным, но, не зная больше о вашем прецеденте, я не могу устранить его.

+0

Ах! Это имеет большой смысл и является прекрасным открытием. Не знаю, почему это не произошло со мной. Параметры находятся там, где эта таблица отрывается на панели управления и на странице задач. Я не хочу, чтобы страница перенаправлялась, когда на панели инструментов. – Callum

Смежные вопросы