ActiveRecord LEFT OUTER JOIN左表上的子句和第一个上的分组

时间:2015-09-04 23:37:22

标签: sql ruby-on-rails postgresql activerecord

我在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条款。

是否有可能获得此类结果,以便稍后我可以使用offersoffers.first.type等生成的offers.first.route.name对象来访问属性?

1 个答案:

答案 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)

这样您就可以按照要求访问优惠和路线。

如果有帮助,请告诉我们