Rails: вызов методов в модели в другом контроллере - PullRequest
0 голосов
/ 17 июня 2019

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

У меня есть Модель пожертвований и Контроллер панели мониторинга иЯ хотел бы отобразить некоторые данные о пожертвованиях на панели инструментов.Я хочу добиться этого путем определения данных, которые мне нужны, в некоторых методах и областях в модели Пожертвования , а затем вызывать их в контроллере панели мониторинга и затем сделать их доступными в панели инструментов *Просмотры**.

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

Вот мой код

Пожертвования Модель

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, payment: true).sum(:amount) }

  def self.deployed_donations_percent
    (deployed_sum.to_f / paid_sum.to_f) * 100
  end

  def self.not_deployed_donations_percent
    (not_deployed_sum.to_f / paid_sum.to_f) * 100
  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_percent = Donation.deployed_donations_percent
    # Not Deployed Donations Percentage
    @not_deployed_donations_percent = Donation.not_deployed_donations_percent
    @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

Индекс панели инструментов

<h2>
    DASHBOARD
</h2>

  <h4>Overall Donations</h4>
  <%#= area_chart @donations.map { |pay|{name: pay.payment, data: @donations.where(payment: pay).group_by_day(:created_at).count}}, discrete: true %>
  <%= line_chart Donation.group(:payment).group_by_day(:created_at).count

   <h4>Total Donations</h4>
    <%= number_with_delimiter(@total_donations_sum, :delimiter => ',') %>

    <h4>Deployed</h4>
     <%= number_with_delimiter(@deployed_donations, :delimiter => ',') %>

    <div>
      <%= @deployed_donations_percent.round %>>
    </div>

    <h4>Undeployed</h4>
    <%= number_with_delimiter(@not_deployed_donations, :delimiter => ',') %>

    <div>
      <%= @not_deployed_donations_percent.round %>
    </div>

<h4>Total Donations</h4>
<header>
  <%= @total_donations %>
</header>

<h4>Paid Donations</h4>
<header>
  <%= @paid_donations %>
</header>

<h4>Unpaid Donations</h4>
<header>
  <%= @unpaid_donations %>
</header>

PROGRAMS
<td>Program Name</td>
<td>Sponsored</td>

</tr>
  <% @programs.each do |program| %>
<tr>
    <td><%= program.name %></td>
<td><%= program.donations.count %></td>

Пожалуйста, я был бы очень признателен за некоторыесправка о том, как провести рефакторинг этого кода и получить методы Donations модели , доступные для контроллера Dashboard .Спасибо.

Ответы [ 2 ]

1 голос
/ 16 июля 2019

Вы также можете попробовать это.

Контроллеры и модели имеют папку под названием относится к , где вы можете хранить коды, которые вы хотите использовать совместно с различными контроллерами и / или моделями.

Просто переместите код, которым вы хотите поделиться, в папку задач, а затем вызовите их для каждой модели.

Вы можете определить код в папке задач, используя модули.

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

Наконец-то я получил его на работу.

Мне нужно было реализовать сервисные объекты с помощью Plain Old Ruby Objects. Для каждого действия я помещал их в отдельный сервис, а затем вызывал их в контроллерах.

Шаги

  1. Создайте папку в каталоге приложения приложения с именем Услуга .
  2. Создание отдельных служб для каждого из действий контроллера.
  3. Позвоните в каждую нужную службу на контроллере.

Вот и все.

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