2016-08-16 5 views
0

をスキップするafter_updateコールバックを微調整私はbookroomモデルいくつかの部分に

class BookRoom < ApplicationRecord 
    has_many :room_customers 
    has_many :rooms, :through => :room_customers 
    after_update :add_dynamic_change, :on => :show 

    private 

    def add_dynamic_change 
    room = Room.find self.room 
    room.update_column :availability, true 
    end 
end 

(0.1ms) begin transaction 
    CACHE (0.0ms) SELECT "rooms".* FROM "rooms" WHERE "rooms"."id" = ? LIMIT ? [["id", 17], ["LIMIT", 1]] 
    -> SQL (1.2ms) UPDATE "rooms" SET "availability" = 't' WHERE "rooms"."id" = ? [["id", 17]] 
    SQL (0.3ms) INSERT INTO "room_customers" ("created_at", "updated_at", "book_room_id", "room_id") VALUES (?, ?, ?, ?) [["created_at", 2016-08-19 13:40:11 UTC], ["updated_at", 2016-08-19 13:40:11 UTC], ["book_room_id", 219], ["room_id", 17]] 
    (2.0ms) commit transaction 

From: /Users/chineduabalogu/work/hotel-management/app/controllers/book_rooms_controller.rb @ line 20 BookRoomsController#create: 

    13: def create 
    14:  @customer = Customer.find(params[:customer_id]) 
    15:  @customer_room = @customer.book_rooms.create(book_rooms_params) 
    16: @room = Room.find @customer_room.room 
    17: require 'pry'; binding.pry 
    18: @book_rooms = BookRoom.where room_number: @room.room_number 
-> 19: @room.book_rooms << @customer_room 
=> 20: require 'pry'; binding.pry 
    21:  flash[:notice] = "Customer has been added to room" 
    22:  redirect_to customer_path(@customer) 
    23: end 

を持っているが、データベースを更新していけない任意の収集方法はありますか? "< <"これは更新が必要なので、私は必要ありません。私は@ room.book_rooms.build @ customer_room.attributesを試しましたが、私はそれを保存する方法を知りません

+0

に読んだ最高の説明ですここでは正確に何をしようとしていますか?私はこれについて考えていて、変わっているようだ。 BookRoomがショービューを介してのみ更新されている場合、BookRoomモデルから部屋の空き状況を更新しようとしていますか? – rii

+0

実際にはBookRoomレコードを更新した後にroom.availabilityをtrueに変更しようとしています......これは実現しようとしている主なものですが、コレクションに追加するとBookRoom私のafter_updateもそこに呼ばれていますが、もし私が何を意味するのであれば、それを望んでいませんか? " - >" –

答えて

0

今、私が考えることができるものから、私は巨大なファンではないが働くことができる1つの潜在的な解決策BookRoomモデルにはattr_accessor :skip_some_callbacksがあり、この解決策で説明されている説明と似ています。https://stackoverflow.com/a/7386222/664675です。次に、コントローラのshowアクションで、この '偽の属性'をtrueに設定してコールバックをスキップすることができます。

あなたのモデルは、この

class RoomsController < ApplicationController 
    attr_accessor :skip_some_callbacks 

のようになります。あなたは次のようになりますあなたのコールバックメソッドもここ after_update :add_dynamic_change, on: :show , unless: :skip_some_callbacks

は私が今までattr_accessorhttps://stackoverflow.com/a/4371458/664675

+0

ええ、私の問題は "<<"メソッドにある...何らかの理由で更新を呼び出す...それにskip_some_callbacksを追加するにはどうすればいいですか?すべてのコレクションメソッドをチェックしました。データベースへの呼び出しをビルドしませんが、どちらかを保存しないので、かなり混乱しています –

+0

私の質問を編集しましたbtw –

+0

私は、潜在的な解決策を試しましたか? – rii

関連する問題