2016-03-25 2 views
0

私がしたいのは、更新時にアソシエーションモデルの値をインクリメントすることです。強いパラメータにインクリメントメソッドを使う方法

schedule has_many roomsおよびrooms belongs_to schedule。 客室モデルでdayを増やしたいと思います。 day除くフィールドは、ビューを介して入力されるであろうが

accepts_nested_attributes_for :rooms, allow_destroy: trueschedule.rb

で定義されている、私は唯一のday自動的に更新したいと思います。

私はincrementメソッドなどを使用しようとしましたが、適用方法を理解していません。

私が期待するビュー画像は次のとおりです。

Day1 
schedule_title1 (Mar 25, 2016) 
    room_name1 

追加した新しい日。

Day1 
schedule_title1 (Mar 25, 2016) 
    room_name1 
Day2 
schedule_title2 (Mar 26, 2016) 
    room_name2 

schema.rb

create_table "rooms", force: :cascade do |t| 
    t.string "name" 
    t.integer "schedule_id" 
    t.integer "day", default: 1 #I'd like to increment when I update 
    ... 
    end 

schedlues_controller.rb

class SchedulesController < ApplicationController 
... 
    def update 

    #I tried some code here before update 

    if @schedule.update(schedule_params) 
     flash[:success] = "schedule updated!" 
     redirect_to root_url 
    else 
     render 'edit' 
    end 
    end 
... 
    private 

    def schedule_params 
     params.require(:schedule).permit(:title, :departure_date, rooms_attributes: [:id, :_destroy, :room, :day]) 
    end 

私はいくつかを入力した後、ボタンやアップデート "部屋を追加" を押すと、私はしたいのですが増分day

_schedule_form.html.erb

<%= simple_nested_form_for(@schedule) do |f| %> 

    <%= f.label :title %> 
    <%= f.text_field :title, class: 'form-control' %> 
    <%= f.label :departure_date %> 
    <%= f.text_field :departure_date, class: 'form-control' %> 

    <div id="room"> 
    <%= f.simple_fields_for :rooms do |r| %> 
     <%= r.input :room %> 
    <% end %> 
    <%= f.link_to_add "Add room", :rooms, data: {target: '#room'}, class: "btn btn-primary" %> 
    </div> 

<% end %> 

あなたが私にどんな提案を与えることができればそれをいただければ幸いです。

+0

部屋自体を更新するためのコールバックの取り付けはどうですか?私はあなたが一日増やしたいと思う状況を完全には分かっていません。 'after_update - > {increment!(:day)}' – oreoluwa

+0

@ololuwaさん、あなたのご意見ありがとうございます。あなたがコメントしたように、私が望むものは不明なことがあります。だから私は新しい質問[最大値を取得して最大+1に設定する方法]を作成しました(http://stackoverflow.com/questions/36228240/how-to-get-the-max-value-and-set-to- max-1)。あなたが私に何か考えを与えることができれば幸いです。 – SamuraiBlue

答えて

0

Rails counter_cacheメソッドRails Guide - Counter Cacheを使用する必要があります。コンベンションはdaysコラムschedules_countの代わりに指定することですが、counter_cache宣言でそのコラムを指定することができます。

スケジュールモデルでは、belongs_toアソシエーションにcounter_cacheを追加する必要があります。

class Schedule < ActiveRecord::Base 

    belongs_to :room, counter_cache: :days 

end 

あなたにもスケジュールを破壊したときに、それが扱うので、これはincrementと、コールバックよりも優れています。

関連する問題