假设我有以下(简化)数据模型:
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
的实际数据库字段,因此似乎不可能。我希望避免将这些计算方法添加到数据库本身,但如果这是唯一的方法....
提前致谢!
答案 0 :(得分:1)
好吧,看起来答案隐藏在普通视线中(照常),在Mongoid文档的Extensions部分下:
Relations - Common Behavior: Extensions
两部分答案:
首先,我想要的方法是select
,而不是where
,所以虽然我不能做我上面提到的建议,但我可以做:
Location.event_dates.select {|date| date.available_spots > 0}
要“scopify”(在本质上),我想要的是扩展Location中定义的关系,如下所示:
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瞧。