"mass query"属于单个对象的一组孙子(has_many、has_many)的最快、最标准的方法是什么?



用例:在此网站上,用户将能够继续选择特定天数的租赁物业。用户通常会出售相同类型的租赁物业。

问题:因为多重"卖家";将出租相同的物品;属性详细页";将由许多不同的卖家创建许多房源(或者在某些情况下,卖家将有多个可用房产落入同一"房产详细信息页面"(。这些";列表";对象将有许多定价对象,这些对象包含日期、价格和可用性布尔值。

当前型号如下:

属性.rb

has_many :listings
has_many :prices, :through => :listings

上市.rb

belongs_to :user
belongs_to :property
has_many :prices

价格.rb

belongs_to :listing

我尝试过的:

例如,如果我想获得特定房产的最低定价总额,我会记下:

# property.rb
# minimum price for a pricing set out of all of the price objects
def minimum_price(start_date, end_date)
# this would sum up each days pricing to give the rental period a final price
prices = self.prices.where("day <= ?", end_date).where("day >= ?", start_date).sum(:price)
end

然而,当我这样做的时候,它只是将每个用户的价格组合在一起,没有任何用处。

如有任何帮助,我们将不胜感激!当然,我可以循环浏览房产列表,直到找到给定日期范围的最低价格,但这似乎需要不必要的时间,而且效率很低。

EDIT应该输出的数据示例是一组价格对象,这些对象是从一个特定列表开始的特定日期范围内最便宜的对象。它不仅可以将所有用户的所有最优惠日期组合在一起,然后添加它们,因为买家将从一个卖家那里租房。

这是所需输出的一个实际例子,因为您可以看到这些价格都来自同一个列表ID。

[#<Price id: 156, day: "2020-12-01", listing_id: 7, price: 5.0, available: true, created_at: "2020-12-17 14:22:46", updated_at: "2020-12-17 14:22:46">, #<Price id: 157, day: "2020-12-02", listing_id: 7, price: 5.0, available: true, created_at: "2020-12-17 14:22:46", updated_at: "2020-12-17 14:22:46">, #<Price id: 158, day: "2020-12-03", listing_id: 7, price: 5.0, available: true, created_at: "2020-12-17 14:22:46", updated_at: "2020-12-17 14:22:46">, #<Price id: 159, day: "2020-12-04", listing_id: 7, price: 5.0, available: true, created_at: "2020-12-17 14:22:46", updated_at: "2020-12-17 14:22:46">]

所以听起来你是在一个属性上调用这个,所以:

prices = self.prices.where("prices.day >= ? AND prices.day <= ?", start_date, end_date).sum(:price).group_by {|price| price.listing_id}

可能有一种基于SQL的方法可以使用AR关系来实现这一点。但这将为每个listing_id提供一个带有键的散列,该键的值应该是总和。我说";应该";因为这对我来说有点抽象,没有一个系统来测试它。

相关内容

  • 没有找到相关文章

最新更新