RoR PostgresQL - 从数据库中获取最新的,不同的值

时间:2018-01-26 17:00:38

标签: ruby-on-rails postgresql

我正在尝试查询我的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对组内的活动进行排序。但是,这需要两个查询。

我想知道我想要的只是一个查询是否可能?

1 个答案:

答案 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

希望有所帮助