Rails: рефакторинг Rubocop - лучший способ рефакторинга с использованием Rubocop - PullRequest
1 голос
/ 11 июня 2019

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

У меня есть следующие проблемы:

  1. Действие контроллера вызывает только один метод модели, отличный от начального поиска или нового.Создайте в модели пользовательские методы .new или .update со всем необходимым.
  2. Филиал назначения Размер условия для индекса слишком велик
  3. В методе слишком много строк

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

Мои коды:

Контроллер панели инструментов (начальный *)

class DashboardController < ApplicationController
  def index
    #Paid Donations in Chart
    @paid_donations = Donation.where(payment: true).count
    #Unpaid Donations in Chart
    @unpaid_donations = Donation.where(payment: false).count
    #Total Donations Sum
    @total_donations_sum = Donation.where(payment: true).sum(:amount)
    #Deployed Donations
    @deployed_donations = Donation.where(deployment: true).sum(:amount)
    #Not Deployed Donations
    @not_deployed_donations = Donation.where(deployment: false,  payment: true).sum(:amount)
    #Deployed Donations Percentage
    @deployed_donations_percentage = (@deployed_donations.to_f / @total_donations_sum.to_f) * 100
    #Not Deployed Donations Percentage
    @not_deployed_donations_percentage = (@not_deployed_donations.to_f / @total_donations_sum.to_f) * 100

    #Total Donations
    @total_donations = Donation.count
    #Paid Donations
    @paid_donations = Donation.where(payment: true).count
    #Unpaid Donations
    @unpaid_donations = Donation.where(payment: false).count

    #All Programs
    @programs = Program.all
  end
end

Контроллер панели инструментов (Рефакторировано)

class DashboardController < ApplicationController    
  def index
    # Paid Donations in Chart
    @paid_donations = Donation.paid_count
    # Unpaid Donations in Chart
    @unpaid_donations = Donation.unpaid_count
    # Total Donations Sum
    @total_donations_sum = Donation.paid_sum
    # Deployed Donations
    @deployed_donations = Donation.deployed_sum
    # Not Deployed Donations
    @not_deployed_donations = Donation.not_deployed_sum
    # Deployed Donations Percentage
    @deployed_donations_percentage = percentage(@deployed_donations, @total_donations_sum)
    # Not Deployed Donations Percentage
    @not_deployed_donations_percentage = (@not_deployed_donations.to_f / @total_donations_sum.to_f) * 100

    # Total Donations
    @total_donations = Donation.count
    # Paid Donations
    @paid_donations = Donation.paid_count
    # Unpaid Donations
    @unpaid_donations = Donation.unpaid_count

    # All Programs
    @programs = Program.all
  end
end

Модель пожертвований (начальная)

class Donation < ApplicationRecord
  belongs_to :program
end

Модель пожертвований (рефакторированная)

Class Donation < ApplicationRecord
  belongs_to :program
  scope :paid_count, -> { where(payment: true).count }
  scope :unpaid_count, -> { where(payment: false).count }
  scope :paid_sum, -> { where(payment: true).sum(:amount) }
  scope :paid_sum, -> { where(payment: true).sum(:amount) }
  scope :deployed_sum, -> { where(deployment: true).sum(:amount) }
  scope :not_deployed_sum, -> { where(deployment: false).sum(:amount) }

  def percentage(donate, total)
    (donate.to_f / total.to_f) * 100
  end
end

Пожалуйста, мне нужна некоторая помощь по передовым методам рельсов, чтобы решить эти проблемы, следуя принципу тощих моделей и рельсов тощих контроллеров.Спасибо.

1 Ответ

0 голосов
/ 12 июня 2019

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

Class Donation < ApplicationRecord
  belongs_to :program
  scope :paid_count, -> { where(payment: true).count }
  scope :unpaid_count, -> { where(payment: false).count }
  scope :paid_sum, -> { where(payment: true).sum(:amount) }
  scope :deployed_sum, -> { where(deployment: true).sum(:amount) }
  scope :not_deployed_sum, -> { where(deployment: false).sum(:amount) }

  def self.deployed_donations_percentage
    (deployed_sum / size) * 100
  end

  def self.not_deployed_donations_percentage
    (not_deployed_sum / size) * 100
  end

  def self.info
    {}.tap do |info|
      info[:paid_donations] = paid_count
      info[:unpaid_donations] = unpaid_count
      info[:total_donations_sum] = paid_count
      info[:deployed_donations_percentage] = deployed_donations_percentage
      info[:not_deployed_donations_percentage] = not_deployed_donations_percentage
      #...anything you want to show
    end

  end
end

в вашем контроллере

class DashboardController < ApplicationController    
  def index
    # donations info
    @donations_info = Donation.info
    # All Programs
    @programs = Program.all
  end
end

и по вашему мнениюВы можете получить доступ к значению с

<%= @donations_info[:paid_donations] %>
...