Как автоматически обновить поля в рельсах - PullRequest
0 голосов
/ 27 июня 2018

У меня есть таблица общих настроек, таблица родителей, таблица детей и таблица средств. У детской таблицы есть finance_id. У каждого ребенка может быть несколько заявок на финансирование. В таблице финансирования есть статус поля, который может изменить только администратор. Как только администратор утвердит заявку, я хочу, чтобы запрашиваемая сумма была вычтена из поля amount_remaining в дочерней таблице. В общих настройках по умолчанию amount_remaining - amount_current_year. Как я могу этого добиться. Пожалуйста, помогите мне.

Схема таблицы финансирования

 create_table "fundings", force: :cascade do |t|
    t.string "type_of_activity"
    t.string "season"
    t.text "activity_details"
    t.string "name_of_organisation"
    t.date "activity_start_date"
    t.string "number_of_weeks"
    t.string "days_per_week"
    t.string "hours_per_day"
    t.integer "program_registration_cost"
    t.string "family_contribution"
    t.integer "other_funds"
    t.string "other_fund_provider"
    t.integer "amount_requested"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.integer "child_id"
    t.string "status"
    t.date "date_submitted"
  end

Общая схема настройки

  create_table "generalsettings", force: :cascade do |t|
    t.integer "amount_current_year"
    t.integer "amount_next_year"
    t.date "current_year"
    t.date "next_year"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
  end

Схема таблицы детей

create_table "children", force: :cascade do |t|
    t.string "firstname"
    t.string "lastname"
    t.date "dateofbirth"
    t.string "gender"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.integer "parent_id"
    t.integer "amount_remaining"
  end

_form.html.erb (форма заявки на финансирование)

<div class='row'>
  <div class= 'col-xs-12'>
    <%= form_for([@parent, @child, @funding], :html => {class: "form-horizontal",role: "form"}) do |form| %>
      <div class = "form-group">
        <div class="control-label col-sm-2">
          <%= form.label :type_of_activity, class: "required" %>
        </div>
        <div class="col-sm-8">
          <%= form.select :type_of_activity, ['Swimming', 'Soccer', 'Cricket', 'Basket Ball'], required: true %>
        </div>
      </div>
      <div class = "form-group">
        <div class="control-label col-sm-2">
          <%= form.label :activity_details, class: "required" %>
        </div>
        <div class="col-sm-8">
          <%= form.text_area :activity_details, required: true %>
        </div>
      </div>
      <div class = "form-group">
        <div class="control-label col-sm-2">
          <%= form.label :name_of_organisation, class: "required" %>
        </div>
        <div class="col-sm-8">
          <%= form.select :name_of_organisation, ['BCCI', 'IPL', 'Sahara', 'Not listed'], class: "form-control", autofocus:true, required: true %>
        </div>
      </div>
      <div class = "form-group">
        <div class="control-label col-sm-2">
          <%= form.label :activity_start_date, class: "required" %>
        </div>
        <div class="col-sm-8">
          <%= form.date_field :activity_start_date, min: Date.today, required: true %>
        </div>
      </div>
      <div class = "form-group">
        <div class="control-label col-sm-2">
          <%= form.label :program_registration_cost, class: "required" %>
        </div>
        <div class="col-sm-8">
          <%= form.text_field :program_registration_cost, required: true %>
        </div>
      </div>
      <div class = "form-group">
        <div class="control-label col-sm-2">
          <%= form.label :amount_requested, class: "required" %>
        </div>
        <div class="col-sm-8">
          <%= form.text_field :amount_requested, required: true %>
        </div>
      </div> 
      <div class = "form-group">
        <div class="control-label col-sm-2">
          <%= form.label :date_submitted, class: "required" %>
        </div>
        <div class="col-sm-8">
          <%= form.date_field :date_submitted, value: Date.today, readonly:true, required: true %>
        </div>
      </div>
      <div class = "form-group">
        <div class="control-label col-sm-2">
          <%= form.label :status %>
        </div>

      <% if current_user.admin? %>
        <div class="col-sm-8">
          <%= form.select :status,['Pending', 'Approved', 'Declined'], class: "form-control" %>
        </div>
      <% else %>
        <div class="col-sm-8">
          <%= form.select :status,['Pending', 'Approved', 'Declined'], {class: "form-control"}, {:disabled => true} %>
        </div>
      <% end %>

      </div> 
      <div class="form-group">
        <div class="col-sm-10">
          <%= form.submit "Apply", class: 'btn btn-primary btn-lg' %>
        </div>
      </div>
    </div>
  </div>

    <% end %>

funding.rb

class Funding < ApplicationRecord
belongs_to :child
end

child.rb

class Child < ApplicationRecord
    belongs_to :parent
    has_many :fundings, dependent: :destroy
end

1 Ответ

0 голосов
/ 27 июня 2018

Я считаю, что в вашем случае AR before_save обратный вызов может быть полезным.

class Funding < ApplicationRecord
  has_one :child
  before_save do
    if status_changed? && status == 'Approved'
      amount_remaining = child.amount_remaining - amount_requested
      child.update_attributes(amount_remaining: amount_remaining)
    end
  end
  ...
end
...