我有这个问题,我有数据库表,如下所示:
"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,更具体地说是如何在范围内做这种选择(我理解它应该是一种关系)
由于
答案 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 }