Rails:需要按最大版本范围

时间:2016-04-12 14:48:24

标签: sql ruby-on-rails scope

我有这个问题,我有数据库表,如下所示:

"63";"CLINICAL...";"Please...";Blah...;"2014-09-23 13:15:59";37;8
"64";"CLINICAL...";"Please...";Blah...;"2014-09-23 13:22:51";37;9

重要的值是倒数第二个和最后一个。 如您所见,倒数第二个(abstract_category_numbers)是相同的,但最后一个不同(version_numbers)

问题在于: 当我创建一个范围时,它会返回所有记录,我需要关注具有最大版本号的记录。

在SQL中我会做这样的事情:

'SELECT * FROM Category c WHERE 
  NOT EXISTS SELECT * FROM Category c1 
    WHERE c.version_number < c1.version_number 
      AND c.abstract_category_id = c1.abstract_category_id'

但是我完全迷失在Ruby,更具体地说是如何在范围内做这种选择(我理解它应该是一种关系)

由于

3 个答案:

答案 0 :(得分:1)

我们可以创建一个范围来选择最大category的{​​{1}},如下所示:

version_number

基本上,我们将在子查询中的scope :with_max_version_number, -> { joins("JOIN ( SELECT abstract_category_id, max(version_number) AS max_version FROM categories GROUP BY abstract_category_id ) AS temp ON temp.abstract_category_id = categories.abstract_category_id AND temp.max_version = categories.version_number" ) } 表中选择max_version值的类别。

顺便说一句,我希望表名是temp,你可以纠正它。然后最后的查询将是:

categories

答案 1 :(得分:0)

即使只有1条记录,也会假设范围返回一个值数组。

如果您想要总是返回1个值,请改用静态方法。

def self.max_abstract_category
  <your_scope>.max_by{ |obj| obj.version_number }
end

答案 2 :(得分:0)

如果我理解你的问题:你有一个带有version_number列的数据库表,其中的rails表示使用的是Active Record模型 - 我会调用Category,因为我没有&#39 ;知道你称之为什么 - 并且你想找到最大Category的单version_number条记录吗?

Category.all.order(version_numbers: :DESC).limit(1).first

此查询要求Category从最高到最低排序的所有version_number条记录,并将请求限制为一条记录(第一条记录,a.k.a为最高记录)。因为此请求的结果是包含一条记录的数组,所以我们在请求上调用.first来简单地返回记录。

据我所知,范围只是一个命名查询(我实际上并不使用范围)。我认为您可以将此查询保存为范围,方法是将以下内容添加到Category模型中。 This rails guide解释了有关范围的更多信息。

scope :highest_version, -> { all.order(version_numbers: :DESC).limit(1).first }