我有一个属性为“max_attendees”的ModelSlot模型。 AvailableSlot has_many BookedSlots。
我正在寻找仍然可用的所有AvailableSlots(expected_slots小于max_attendees的地方)
我试过
scope :with_capacity, -> { joins('LEFT OUTER JOIN booked_slots on booked_slots.available_slot_id = available_slots.id')
.group('available_slots.id').having("booked_slots.count < available_slots.max_attendees") }
和
#AvailableSlot.rb
def self.with_capacity
self.select{ |s| s.booked_slots.count < s.max_attendees }
end
但是这些返回数组,第一个不能执行“.count”,第二个解决方案不能执行“.limit(3)”,因为返回的数据不是活动记录。 / p>
最后一个问题:做某事,
AvailableSlot.joins(:booked_slots).where("booked_slots.length < ?, max_attendees)
我不能使用.length,因为这不是daily_slots下的列。在使用.count,.length等activerecord方法时,使用这种.joins.where格式的方法是什么?
答案 0 :(得分:0)
您需要为拥有。
创建虚拟属性AvailableSlot.
joins('LEFT OUTER JOIN booked_slots on booked_slots.available_slot_id = available_slots.id').
select('available_slots.*, count(booked_slots) as booked_slots_count').
group('available_slots.id').
having('booked_slots_count < max_attendees')
这也会向模型公开虚拟属性。
请注意,这会使.count
变得更加复杂,并且您必须将爵士乐传递给它,请查看文档中提供的选项:http://apidock.com/rails/ActiveRecord/Calculations/ClassMethods/count