2014-10-16 7 views
0

У меня есть модель AvailableSlot с атрибутом «max_attendees». AvailableSlot has_many BookedSlots.Как вы извлекаете записи на основе состояния дочерних элементов?

Ищу всех AvailableSlots, которые все еще доступны (где booked_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)», потому что возвращаемые данные не являются активными записями.

последний вопрос: делать вещи, как,

AvailableSlot.joins(:booked_slots).where("booked_slots.length < ?, max_attendees) 

Я не могу использовать .length, потому что это не столбец под booked_slots. Какой способ использовать этот формат .joins.where при использовании методов activerecord, таких как .count, .length и т. Д.?

ответ

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

Смежные вопросы