我正在尝试查询我的PostgreSQL数据库以获取最新的(通过created_at)和distinct(通过user_id)Activity对象,其中每个用户在数据库中有多个活动。活动对象的结构如下:
import UIKit
class ViewController: UIViewController {
@IBOutlet var image1: UIImageView! // your image outlet
override func viewDidLoad() {
super.viewDidLoad()
// Do any additional setup after loading the view, typically from a nib.
}
override func viewDidAppear(_ animated: Bool) {
let trianglePath = UIBezierPath()
trianglePath.move(to: CGPoint(x: 0, y: image1.frame.size.height - 60))
trianglePath.addLine(to: CGPoint(x:0, y: image1.frame.size.height))
trianglePath.addLine(to: CGPoint(x: image1.frame.size.width, y: image1.frame.size.height))
trianglePath.close()
let path = UIBezierPath(rect: view.bounds)
path.append(trianglePath)
let maskLayer = CAShapeLayer()
maskLayer.frame = image1.bounds
maskLayer.fillRule = kCAFillRuleEvenOdd
maskLayer.path = path.cgPath
image1.layer.mask = maskLayer
}
override func didReceiveMemoryWarning() {
super.didReceiveMemoryWarning()
// Dispose of any resources that can be recreated.
}
}
我首先尝试让以下查询起作用:
Activity(id, user_id, created_at, ...)
然而,不断得到以下错误:
Activity.order('created_at DESC').select('DISTINCT ON (activities.user_id) activities.*')
根据这篇文章:PG::Error: SELECT DISTINCT, ORDER BY expressions must appear in select list,看起来ORDER BY子句只能在应用DISTINCT后应用。这对我没有帮助,因为我想通过user_id获取不同的活动,但也希望活动是最近创建的活动。因此,我需要在获得不同的活动之前对活动进行排序。
我提出了一个有效的解决方案,但首先按用户ID对活动进行分组,然后通过created_at对组内的活动进行排序。但是,这需要两个查询。
我想知道我想要的只是一个查询是否可能?
答案 0 :(得分:2)
这应该可行,请尝试以下
解决方案1
Activity.select('DISTINCT ON (activities.user_id) activities.*').order('created_at DESC')
解决方案2
如果不能正常工作解决方案1 ,那么如果您为此创建范围,这将非常有用
activity
型号
scope :latest, -> {
select("distinct on(user_id) activities.user_id,
activities.*").
order("user_id, created_at desc")
}
现在你可以在下面的任何地方调用它
Activity.latest
希望有所帮助