Rails - конвертируйте часы и минуты в секунды, затем присвойте ключу значение

Я хотел бы объединить оба значения :hours а также :minutes и преобразовать их в to_i в секундах Далее следует присвоить это значение (которое должно быть в секундах) :time_duration который является столбцом в cars дБ, прежде чем он создает новый service, :time_duration находится в hidden_field потому что нет причин отображать эти данные в представлении.

Просмотры

Это мое _car_fields.html.erb который является вложенным частичным внутри шаблона представления с именем, _form.html.erb,

_car_fields.html.erb

<div class="nested-fields">
  <div class="field">
        <%= f.label :name %><br>
        <%= f.text_field :name %><br>
        <%= f.label :hours %>
        <%= f.select :hours, '0'..'8' %>
        <%= f.label :minutes %>
        <%= f.select :minutes, options_for_select( (0..45).step(15), selected: f.object.minutes )%><br>
        <%= f.label :price %><br>
        <%= f.text_field :price, :value => (number_with_precision(f.object.price, :precision => 2) || 0) %> <br>
        <%= f.label :details %><br>
        <%= f.text_area :details %></div>
    <%= link_to_remove_association "Remove Car", f, class: 'btn btn-default' %>
   <%= f.hidden_field :time_duration, value: %>
  <br>
    <hr>
</div>

_form.html.erb

<%= simple_form_for @service do |f| %>
  <div class="field">

    <%= f.label "Select service category" %>
    <br>

    <%= collection_select(:service, :service_menu_id, ServiceMenu.all, :id, :name, {:prompt => true }) %>

    <%= f.fields_for :cars do |task| %>
      <%= render 'car_fields', :f => task %>
    <% end %>
  </div>

  <div class="links">
    <%= link_to_add_association 'Add New Car', f, :cars, class: 'btn btn-default' %>
  </div><br>

  <div class="actions">
    <%= f.submit %>
  </div>
<% end %>

контроллер

services_controller

def new
    @service = current_tech.services.build
  end

  def create
    @service = current_tech.services.build(service_params)

    respond_to do |format|
      if @service.save
        format.html { redirect_to @service, notice: 'Service was successfully created.' }
        format.json { render :show, status: :created, location: @service }
      else
        format.html { render :new }
        format.json { render json: @service.errors, status: :unprocessable_entity }
      end
    end
  end

  private

    def service_params
      params.require(:service).permit(:name, :service_menu_id, cars_attributes: [:tech_id, :name, :hours, :minutes, :price, :details, :_destroy])
    end

модели

service.rb

class Service < ActiveRecord::Base  
    belongs_to :tech
    belongs_to :service_menu
    has_many :cars, dependent: :destroy
    accepts_nested_attributes_for :cars, :reject_if => :all_blank, :allow_destroy => true
end

car.rb

class Car< ActiveRecord::Base
  belongs_to :service
  belongs_to :tech
  has_many :appointments 
end

1 ответ

Решение

Во-первых, вы можете удалить скрытые time_duration поле из формы, так как оно не нужно.

Затем вы создадите before_save метод для вашей модели автомобиля:

car.rb

class Car < ActiveRecord::Base
  belongs_to :service
  belongs_to :tech
  has_many :appointments 

  before_save :generate_time_duration

  def generate_time_duration
    self[:time_duration] = hours.hours.to_i + minutes.minutes.to_i
  end
end

Что это делает: перед сохранением объекта автомобиля он запускает generate_time_duration метод. Что этот метод делает, это просто суммирует hours.to_i а также minutes.to_i и назначает его на автомобиль time_duration приписывать.


Обновить старые записи БД

Поскольку вы добавляете эту функцию в свое приложение ПОСЛЕ того, как записи уже созданы, вот быстрый способ обновить все ваши текущие записи:

  1. В командной строке откройте консоль rails, выполнив команду rails c (или же rails console)
  2. В консоли выполните эту команду: Car.all.each { |c| c.save! }

Это быстрое одноразовое исправление, которое будет циклически просматривать все записи автомобилей, сохранять их и впоследствии обновлять их. time_duration поля.

Другие вопросы по тегам