В моем приложении я могу искать consumptions
по датам
У меня есть активная модель записи Потребление , которая belongs_to :users
и модель ПотреблениеSearch
потребление.rb
class Consumption < ApplicationRecord
belongs_to :user
end
потребление_поиск.рб
class ConsumptionSearch
attr_reader :date_from, :date_to
def initialize(params)
params ||= {}
@date_from = parsed_date(params[:date_from],Time.now.beginning_of_month.to_date.to_s)
@date_to = parsed_date(params[:date_to], (Date.today + 1).to_s)
end
def date_range
Consumption.where('created_at BETWEEN ? AND ?', @date_from, @date_to)
end
private
def parsed_date(date_string, default)
Date.parse(date_string)
rescue ArgumentError, TypeError
default
end
end
В действии consumptions_controller
в действии index
я могу получить требуемые расходы по дате
class ConsumptionsController < ApplicationController
def index
@search = ConsumptionSearch.new(params[:search])
@consumptions = @search.date_range
@consumptions = @consumptions.order('created_at ASC').where(user_id: current_user.id)
end
end
Схема потребления может помочь:
create_table "consumptions", force: :cascade do |t|
t.float "total_price"
t.float "kilometers"
t.string "shop"
t.float "liter_price"
t.float "total_liters"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.integer "user_id"
t.float "difference", default: 0.0
end
Так что в моем consumptions/view/index.html.erb
мне просто нужно перебрать @consumptions
, чтобы отобразить то, что мне нужно.
Вопрос в следующем:
Как я могу сделать это более "рубиновым путем", у меня слишком много логики в представлении ... Где и как мне извлечь логику?спасибо
<%= price = (@consumptions.map { |c| c.total_price }.sum - @consumptions.last.total_price).round(2) %>
<%= total_km = (@consumptions.map { |c| c.difference }.sum).round.abs %>
<%= (price / total_km).round(4) %>
<%= (price / total_km * 100).round(2) %>