我在PostgreSQL中有两个类似于前两个的表。 routes
表只是可用于过滤的一些额外数据的可用路线列表。 offers
表有多个路线价格(价格取决于类型)。
offers
id | route_id | type | price
----+-----------+-------+------
1 | 853 | type5 | 444
2 | 853 | type1 | 333
3 | 854 | type1 | 555
4 | 854 | type2 | 111
5 | 857 | type2 | 999
6 | 858 | type3 | 888
routes
id | name | destination_id | car_type
----+--------------+----------------+----------
6 | Ea magnia | 1 | car1
7 | Omnis qe | 1 | car2
8 | Ut faci | 2 | car2
853 | Ut aspe | 3 | car1
854 | Fugiat atibu | 1 | car2
和那些类似的简单模型:
class Offer < ActiveRecord::Base
has_many :offers
end
class Route < ActiveRecord::Base
belongs_to :offer
end
预期结果表可能如下所示:
Expected result
id | route_id | type | price | name | destination_id | car_type
----+----------+-------+-------+--------------+----------------+----------
2 | 853 | type1 | 333 | Ut aspe | 3 | car1
4 | 854 | type2 | 111 | Fugiat atibu | 1 | car2
所以,基本上,我需要获得每条路线的最低价格和路线信息的优惠清单。我不知道如何使用ActiveRecord。
我可以做Offer.joins(:route).where("routes.destination_id = 1").group(:route_id).minimum(:price)
之类的事情,但这不符合我的期望。 +我需要在where
上运行不同的offers
条款。
是否有可能获得此类结果,以便稍后我可以使用offers
或offers.first.type
等生成的offers.first.route.name
对象来访问属性?
答案 0 :(得分:1)
在这种情况下,您可以使用自定义内部联接。类似的东西:
bestOffers = Offer.all.joins("inner join (select route_id, min(price) as mini from offers group by route_id) as b on b.route_id=offers.route_id and b.mini=offers.price").includes(:route)
这样您就可以按照要求访问优惠和路线。
如果有帮助,请告诉我们