2014-10-16 41 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) 

我不能使用。長度,因爲這不是在booked_slots列。在使用像.count,.length等activerecord方法時,使用這種.joins.where格式的方法是什麼?

回答

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