Rails activerecord加入连接表的update_all属性

时间:2016-06-01 14:43:35

标签: ruby-on-rails join activerecord sql-update

我有以下关系:

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

我正在尝试从属于某些预订的房间更新属性'status'。类似的东西:

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

但显然它不会像这样工作。我想在一个查询中完成它但我无法理解它。我错过了什么?

2 个答案:

答案 0 :(得分:1)

您应该通过has_many,通过:room_requests ..

将您的预订模型与客房相关联

完成后,您可以轻松使用:

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

但是,请确保您的room_requests可用,并通过room_requests将预订分配给房间。

干杯, Ť

答案 1 :(得分:1)

最后我无法以这种方式进行查询,因为我需要更新的是Room模型,而查询是在Reservation模型中完成的。我需要扭转局面,然后想出来:

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