2013-01-10 65 views
1

比方說,我已經得到了以下(簡化)數據模型:根據關係的計算字段確定查詢範圍?

class Location 
    include Mongoid::Document 

    has_many :event_dates 
end 

class EventDate 
    include Mongoid::Document 

    has_many :event_sessions 
    belongs_to :location 

    def total_spots 
    self.event_sessions.sum("max_participants") 
    end 

    def booked_spots 
    self.event_sessions.sum("participants_count") 
    end 

    def available_spots 
    self.total_spots - self.booked_spots 
    end 
end 

class EventSession 
    include Mongoid::Document 
    belongs_to :event_date 

    field :max_participants 
    field :participants_count 
end 

我知道可以得到所有的只是位置的活動日期:

Location.event_dates 

但哪能範圍查詢例如,只有獲得可用地點的活動日期?即

Location.event_dates.where(available_spots > 0) 

由於available_spots是一個計算值,而不是EventDate一個實際的數據庫字段,似乎並不可能的。我希望避免將這些計算方法添加到數據庫本身,但是如果它是唯一的方法... ...

在此先感謝!

回答

1

好,像答案是在簡單的視域(如常)隱藏,根據Mongoid文檔的擴展部分:

Relations - Common Behavior: Extensions

兩個部分答案:

首先,該方法我要的是select,不where,因此,雖然我不能做我上面提出的,我可以做:

Location.event_dates.select {|date| date.available_spots > 0} 

要 「scopify」 這(在essense),我要的是在位置定義擴展的關係如下:

class Location 
    has_many :event_dates do 
    def with_available_spots 
     @target.select {|date| date.available_spots > 0} 
    end 

所以,現在我可以打電話,簡單地說:

Location.event_dates.with_available_spots 

Et瞧。

+1

在這裏做一個選擇是迫使Rails獲取所有的event_dates,將它們翻譯爲Ruby對象,然後檢查每一個以查看它們是否有可用點。我會尋找一個面向數據庫的解決方案來避免這種資源浪費。 – MrYoshiji

+0

完全同意 - 謝謝。事實上,一位幫助過此事的朋友提出了完全相同的觀點。從長遠來看,最好讓數據庫在這裏完成繁重的工作,而不是Rails。 – nlh