重构一种按状态查找记录的方法

时间:2013-07-30 14:02:50

标签: ruby-on-rails ruby ruby-on-rails-3.2 ruby-on-rails-4

我目前在我的@tasks上使用.find_by_status(params [:status])来查找未关闭或粘滞的任务。 (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>

我是rails的新手,我真的在努力重构这个。我可能更喜欢将这些链接变成一个下拉选择过滤器,但我也很挣扎。

感谢任何帮助!

1 个答案:

答案 0 :(得分: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后,状态无法为false。)

您可以将视图代码清理为:

<% 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作为常量,而不是将其编码到视图中。

此外,您通过param指定控制器和操作的事实很奇怪,但是如果不了解您的用例,我无法解决这个问题。