0

Rails でカウント可能なリソースをレンタルするための予約システムを作成しています。リソースの所有者は、一定期間に予約されたリソースの総量をパーセンテージで表示したいと考えています。

calendar_for gem は良い選択のようですが、このパーセンテージを一定期間にわたって表示する方法が見つかりません。

合計リソースが 100 であるとします。

  • client-A は 2013 年 1 月 12 日から 2013 年 2 月 20 日まで 20 ユニットを予約します。
  • client-B は 2013 年 1 月 15 日から 2013 年 3 月 1 日まで 30 ユニットを予約します。

予約容量を確認したい

  • 2013 年 1 月 12 日から 2013 年 1 月 14 日まで = 20% (クライアント A からの予約のみ)
  • 2013 年 1 月 15 日から 2013 年 2 月 20 日まで = 50% (20+30) (クライアント A およびクライアント B からの予約)
  • 2013 年 2 月 21 日から 2013 年 3 月 1 日まで = 30% (クライアント B からの予約のみ)

徐々に、私はこれらの宝石を集めました

  • gem「イベントカレンダー」
  • 宝石「table_builder」
  • 宝石「watu_table_builder」
  • 宝石「calendar_date_select」

以下のコードは、RailsCast #213 の有名なレッスンの複製です。

index_calendar.html.erb

    <%=  @date.prev_month.strftime("%B %Y") %>
<%= calendar_for(@bookings, :year => @date.year, :month => @date.prev_month.month) do |calendar| %>

  <%= calendar.head('Sun', 'Mon', 'Tue', 'Wed', 'Thr', 'Fri', 'Sat') %>

  <% calendar.day(:day_method => :from_date) do |date, bookings| %>
    <%= date.day %>
    <ul>
      <% for booking in bookings %>
        <li><%= link_to h(booking.capacity), booking %></li>
      <% end %>
    </ul>
  <% end %>

<% end %>

代替は次のとおりです。

<li><%= link_to h(booking.total_capacity(date)), booking %></li>

これは、 booking.rbの 2 つの方法と組み合わせて試しました。

これは from_date (開始時) に予約されたユニットのパーセンテージを示します。

def capacity
  @a=Resource.find_by_id(self.resource_id).units
  [(self.units/@a*100).to_s + "%"].join
end

これは from_date の合計予約のみを表示します

def total_capacity(day)
  @wall=Booking.joins(:resource).
    where("#{day}<=till_time AND from_time>#{day}").sum(:units)
end

予約モデルには次のフィールドがあります。

  • :from_date,
  • :日まで、
  • :単位

リソースモデル

  • :単位

ありがとう、ニック

4

1 に答える 1

0

私の質問に対する解決策は、この質問への回答として得られました: Fill object from array

booking_days/index_calendar.html.erb

<%=  @date.prev_month.strftime("%B %Y") %>
<%= calendar_for(@booking_days, :year => @date.year, :month => @date.month) do |calendar| %>

  <%= calendar.head('Sun', 'Mon', 'Tue', 'Wed', 'Thr', 'Fri', 'Sat') %>

  <% calendar.day(:day_method => :day) do |date, booking_days| %>
    <%= date.day %>
    <ul>
      <% for booking_day in booking_days %>
        <li><%= link_to h(booking_day.value), booking_day %></li>
      <% end %>
    </ul>
  <% end %>
<% end %>

これはbooking_days_controller.rbでバックアップされました

def index_calendar
    @date = params[:month] ? Date.strptime(params[:month],"%Y-%m") : Date.today
    dstart=@date.prev_month.beginning_of_month
    dend=@date.next_month.end_of_month
    rid=Resource.find_by_user_id(session[:user_id]).id
    sql = ["select @row := @row + 1 as id, ts.dat as day, sum(bookings.value) as value " +
        "from (select adddate('#{dstart}', num1000.i) as dat " + 
        "from num1000 where adddate('#{dstart}', num1000.i) <= '#{dend}') as ts, resources, " + 
        "bookings JOIN  (SELECT @row := 0) r " + 
        "where bookings.resources_id=resources.id AND resources.id=#{rid} AND " + 
        "adddate(bookings.from_time,-1)<=ts.dat AND ts.dat<=bookings.till_time group by ts.dat"].join
    @booking_days = BookingDay.find_by_sql(sql)
    respond_to do |format|
      format.html # index_calendar.html.erb
      format.json { render json: @booking_days }
    end
  end

Booking_days は「その場で」作成され、DB には保存されません。

Booking_day の構造は {:id, :value, :day} です。

予約オブジェクトは DB に格納され、{:user_id, :resource_id, :from_time, :to_time, :value} という構造を持ちます。これは、booking_day オブジェクトを介してカレンダーに表示されるすべての情報のベースです。

num1000 は i=0...999 のテーブルです

ニック

于 2013-06-25T18:12:05.023 に答える