如何在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)