【问题标题】:Translating a (slightly complex) raw SQL query to ActiveRecord/Arel?将(稍微复杂的)原始 SQL 查询转换为 ActiveRecord/Arel?
【发布时间】:2012-03-26 21:11:57
【问题描述】:

我有一个非常简单的 Rails 应用程序和一个非常简单的关系数据库:类别有很多示例。我只想加载具有 X 个样本的类别。

在普通的 SQL 中,我会这样做:

SELECT
    categories.*
FROM
    categories
JOIN
    (SELECT
        category_id, COUNT(*) as sample_count
    FROM
        samples
    GROUP BY
        category_id
    ) AS subselect
ON
    categories.id=subselect.category_id
WHERE
    subselect.sample_count = X; -- where X is whatever

顺便说一句,这很好用,但使用原始 SQL 并不是很像 Rails。显然我想将这些类别作为模型实例,所以:

我将如何将类似的内容重写到 ActiveRecord 或 Arel 查询?这是否可行,或者我应该使用普通 SQL 吗?有没有更简单的方法?

【问题讨论】:

    标签: ruby-on-rails activerecord arel


    【解决方案1】:

    一个可能的好方法是使用 counter_cache,如本页所述:http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html

    将名为 samples_count 的列添加到您的 Category 模型中:

    add_column :categories, :samples_count, :integer
    

    在您的示例模型中更新 belongs_to 如下:

    belongs_to :category , :counter_cache => true 
    

    您现在可以使用计数作为条件,例如:

    Category.where(:samples_count => 7)
    

    【讨论】:

    • 啊,很好很干净!我正在考虑将samples_count 列添加到类别中,但我不知道Rails 有内置的逻辑来使其保持最新(不知道我是怎么错过的)。不想自己写,所以没追 :)
    猜你喜欢
    • 2021-11-27
    • 1970-01-01
    • 2014-05-14
    • 2012-11-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多