fedest
fedest

Reputation: 1350

Rails activerecord joins update_all attribute of joined table

I have the following relations:

reservation.rb

has_many :room_requests, dependent: :destroy, inverse_of: :reservation
accepts_nested_attributes_for :room_requests, allow_destroy: true
has_many :rooms, through: :room_requests

room_request.rb

belongs_to :reservation
belongs_to :room

room.rb

has_many :room_requests
has_many :reservations, through: :room_requests

And I'm trying update the attribute 'status' from rooms that belong to certain reservations. Something like:

Reservation.joins(:rooms).update_all('rooms.status': 'to_clean')

But evidently it doesn't work like this. I want to do it in a single query but I can't quite grasp it. What am I missing?

Upvotes: 0

Views: 1493

Answers (2)

fedest
fedest

Reputation: 1350

In the end I couldn't do the query that way because what I needed to update was on the Room model, and the query was being done in the Reservation model. I needed to reverse it, and came up with this:

Room.where(id: RoomRequest.where(reservation: Reservation.checked_in).select(:room_id)).update_all(status: Room.statuses[:to_clean])

Upvotes: 1

Thomas C
Thomas C

Reputation: 794

You should link your Reservations model also with Rooms via a has_many, through: room_requests..

Once done you can easily go with:

Reservations.rooms.status.update_all('rooms.status': 'to_clean')

However, make sure that your room_requests are available and that reservations are thus assigned to rooms via the room_requests.

Cheers, T

Upvotes: 0

Related Questions