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
приписывать.
Обновить старые записи БД
Поскольку вы добавляете эту функцию в свое приложение ПОСЛЕ того, как записи уже созданы, вот быстрый способ обновить все ваши текущие записи:
- В командной строке откройте консоль rails, выполнив команду
rails c
(или жеrails console
) - В консоли выполните эту команду:
Car.all.each { |c| c.save! }
Это быстрое одноразовое исправление, которое будет циклически просматривать все записи автомобилей, сохранять их и впоследствии обновлять их. time_duration
поля.