Как я могу рефакторинг этого кода рельсов в моем контроллере? - PullRequest
0 голосов
/ 19 апреля 2020

В настоящее время у меня есть это внутри моего контроллера:

        @employees = Employee.all
        #need to keep params different because of nested route(id) and filter form params
        if !params[:employee].blank? && !params[:contact].blank?
            @logs = Log.both_filters(params[:employee], params[:contact]).date_ordered
        elsif params[:employee_id] 
            @logs = Log.by_employee(params[:employee_id]).date_ordered
        elsif !params[:employee].blank?
            @logs = Log.by_employee(params[:employee]).date_ordered
        elsif params[:contact_id]
            @logs = Log.by_contact(params[:contact_id]).date_ordered
        elsif !params[:contact].blank?
            @logs = Log.by_contact(params[:contact]).date_ordered
        else
            @logs = Log.all.date_ordered
        end
    end 

Мне пришлось установить два разных параметра, потому что индекс также является вложенным маршрутом для сотрудников и для контактов (params [: contact_id]), а затем я Также хотел бы отличить guish загрузку от двух фильтров (params [: contact]).

Я установил параметры для фильтров в моей модели:

        where(employee: employee_id)
    end 


    def self.by_contact(contact_id)
        where(contact: contact_id)
    end 

Это просто выглядит как много логик c в моем контроллере, и есть небольшое повторение. Я только на Ruby на Rails, пока нет JS.

Заранее спасибо!

1 Ответ

0 голосов
/ 19 апреля 2020

Вы можете создать отдельный класс для обработки этого:

class LogFilter
  def initialize(args = {})
    @contact = args[:contact]
    @contact_id = args[:contact_id]
    @employee = args[:employee]
    @employee_id = args[:employee_id]
  end

  def call
    return Log.both_filters(employee, contact).date_ordered      if employee? && contact?
    return Log.by_employee(employee_id || employee).date_ordered if employee_id.present? || employee?
    return Log.by_contact(contact_id   || contact).date_ordered  if contact_id.present?  || contact?

    Log.all.date_ordered
  end

  private

  attr_reader :contact, :employee

  def contact?
    contact.present?
  end

  def employee?
    employee.present?
  end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...