繁体   English   中英

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

[英]How to select unique records based on foreign key column in 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

更新

如果您想要所有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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM