【发布时间】:2014-06-04 15:03:31
【问题描述】:
我没有运气编写一个返回我正在寻找的东西的 Rails 查询。建议的、已发布的解决方案不允许我按与我为 DISTINCT 选择的属性不同的属性进行排序。
在我的情况下:每个用户都可以购买多个订单商品。甚至可以在同一日期多次购买同一次旅行(比如他们想加一个朋友)。我只想为每个唯一的 :trip_date_id 返回一个 OrderItem 记录,然后按该 id 上的 :start_date 排序。
模型结构
OrderItem
# id :integer
# trip_id :integer
# trip_date_id :integer
# buyer_id :integer
belongs_to :trip
belongs_to :trip_date
belongs_to :user, :class_name => 'User', :foreign_key => :buyer_id
TripDate
# id :integer
# start_date :datetime
has_one :order_item
belongs_to :trip
Trip
# id :integer
# descr :text
has_many :trip_dates
has_many :order_items
User
# id :integer
has_many :order_items, :class_name => 'OrderItem', :foreign_key => 'buyer_id'
查询尝试
User.rb
*does not return unique trip_date_ids >
self.order_items.joins(:trip_date).where(buyer_id: self.id).select("DISTINCT(order_items.trip_date_id), trip_dates.start_date, order_items.*").order("order_items.trip_date_id").order("trip_dates.start_date ASC")
*some postings have suggested this >
self.order_items.joins(:trip_date).where(buyer_id: self.id).order("order_items.trip_date_id ASC, trip_dates.start_date ASC").select("DISTINCT ON(trip_date_id) order_items.trip_date_id, order_items. *")
但是,最后一个查询不按 trip_date.start_date 排序。我想先按trip_date.start_date 排序,但按trip_date_id 选择不同的。因为 Postgres 希望第一个 order_by 项目与第一个 DISTINCT 项目匹配,所以我似乎不能同时做这两个项目。有没有人可以在不使用 .each 循环的情况下解决这个问题?
【问题讨论】:
-
为什么
trip和trip_date不能合二为一? -
每次旅行有多个旅行日期。
-
阐明了上面代码中的关系。
标签: ruby-on-rails postgresql ruby-on-rails-4 postgresql-9.1