如何在Rails中基于外键列选择唯一记录?

我的Rails 4.1应用程序中有以下模型结构:

delivery_service.rb

class DeliveryService < ActiveRecord::Base attr_accessible :name, :description, :courier_name, :active, :country_ids has_many :prices, class_name: 'DeliveryServicePrice', dependent: :delete_all end 

delivery_service_price.rb

 class DeliveryServicePrice < ActiveRecord::Base attr_accessible :code, :price, :description, :min_weight, :max_weight, :min_length, :max_length, :min_thickness, :max_thickness, :active, :delivery_service_id belongs_to :delivery_service end 

如您所见,送货服务有很多送货服务价格。 我正在尝试从送货服务价格表中检索记录; 选择外键唯一范围内具有最低价格属性的记录 ,delivery_service_id(基本上是每个交付服务的最便宜的交付服务价格)。

如何使用外键属性作为范围从表中选择唯一记录?

我希望我已经解释得足够了,如果您需要更多信息,请告诉我。

谢谢

更新#1:

我正在努力实现的例子:

delivery_service_prices表:

id:1,价格:2.20,delivery_service_id:1

id:2,价格:10.58,delivery_service_id:1

id:3,价格:4.88,delivery_service_id:2

id:4,价格:1.20,delivery_service_id:2

id:5,价格:14.99,delivery_service_id:3

预期成绩:

id:1,价格:2.20,delivery_service_id:1

id:4,价格:1.20,delivery_service_id:2

id:5,价格:14.99,delivery_service_id:3

由于PostgreSQL对遵守SQL标准更加严格(正确地说是这样),因此需要进行一些调整才能获得正确的结果。

以下查询返回每个交付服务的最低交付服务价格的正确结果:

 DeliveryServicePrice.select('DISTINCT ON (delivery_service_id) *').order('delivery_service_id, price ASC') 

我需要将delivery_service_id属性添加到订单条件,否则PostgreSQL会抛出以下列错误:

 PG::InvalidColumnReference: ERROR: SELECT DISTINCT ON expressions must match initial ORDER BY expressions 

希望这可以帮助任何偶然发现它的人!

要获得单个记录的最小值,您可以使用

 DeliveryServicePrice.where(delivery_service_id: x).order(:price).limit(1).first 

或者如果您有delivery_service对象可用

 delivery_service.prices.order(:price).limit(1).first 

UPDATE

如果您想要所有service_delivery_id的所有最小值,则可以使用group查询

 DeliveryServicePrice.group(:delivery_service_id).minimum(:price) 

这将使你几乎到达你想去的地方

 { 1: 2.20, 2: 1.20, 3: 14.99 } 

使用包含delivery_service_id和价格的哈希。 (你看不到price_id)