首页 > 解决方案 > 提供重构代码(过滤方法)

问题描述

我写了一个函数来过滤我网站上的条目,但它看起来很麻烦。而且我确信这段代码可以写得更简单、更简单,我将非常感谢任何帮助。下面是函数本身。

def search
  if current_user.tutor?    
    if params[:subject_id] == ""
      @help_requests = HelpRequest.all.order(created_at: params[:direction] == "1" ? :desc : :asc)
    else
      @help_requests = HelpRequest.where("subject_id IN (?)", params[:subject_id]).order(created_at: params[:direction] == "1" ? :desc : :asc)
    end
    respond_to do |format|
      format.js {render}
    end
  else
    @help_requests = HelpRequest.list_of_request params:[subject_id]
    respond_to do |format|
      format.js {render}
    end
  end
end

标签: ruby-on-railsrubyrefactoring

解决方案


为了避免你写两次,你可以将两个语句移到语句respond_to do |format|之外if

def search
  if current_user.tutor?    
    if params[:subject_id] == ""
      @help_requests = HelpRequest.all.order(created_at: params[:direction] == "1" ? :desc : :asc)
    else
      @help_requests = HelpRequest.where("subject_id IN (?)", params[:subject_id]).order(created_at: params[:direction] == "1" ? :desc : :asc)
    end
  else
    @help_requests = HelpRequest.list_of_request params:[subject_id]
  end
  respond_to do |format|
    format.js {render}
  end
end

另一件要尝试的事情是缩短@help_requests = HelpRequesthelp_requests这个:

def search
  if current_user.tutor?    
    if params[:subject_id] == ""
      help_requests.all.order(created_at: params[:direction] == "1" ? :desc : :asc)
    else
      help_requests.where("subject_id IN (?)", params[:subject_id]).order(created_at: params[:direction] == "1" ? :desc : :asc)
    end
  else
    help_requests.list_of_request params:[subject_id]
  end
  respond_to do |format|
    format.js {render}
  end
end

private

  def help_requests
    @help_requests = HelpRequest
  end

推荐阅读