【问题标题】:How to Count the Elements in an SQL Array using Ruby on Rails Queries如何使用 Ruby on Rails 查询计算 SQL 数组中的元素
【发布时间】:2020-11-24 04:33:01
【问题描述】:

我想计算特定于用户 ID 的数组中元素的数量,然后显示该数字。 last_viewed 数组跟踪用户上次访问的事件。

schema.db 看起来像这样(它不是我认为解决问题所必需的整个架构。)

create_table "users", id: :serial, force: :cascade do |t|
   t.integer "last_viewed", default: [], array: true
end

我试过了

<%= ((Users.last_viewed.where("id = ?", current_user.id)).count) %>

但似乎认为 last_viewed 是一种方法,而不是用户表的一部分。

我知道如何使用真正的 SQL,但是 Ruby on Rails 中的这些查询令人困惑。 本质上,我想将这段 SQL 代码转换为可在 Ruby 上运行的代码。

SELECT array_length(u.last_viewed, 1) 
FROM users u 
WHERE u.id = <user's id>;

【问题讨论】:

  • 我认为正确的查询应该是Users.where("id = ?", current_user.id)).last_viewed.count
  • 您是否考虑过使用 Arel 定义 array_length 函数以便在模型中引用它?好处会有所不同,但对于一个非常大的数组,您不必将它检索到 Rails 来处理它。

标签: sql ruby-on-rails postgresql activerecord


【解决方案1】:

last_viewed 是 users 表中的一列,它充当 User 模型实例中的方法。如果您没有该类的实例,则除非您定义了自己的方法,否则您无法使用该方法。

要从 id 等于 current_user.id 的用户那里获得 last_viewed 的总数,您可以简单地使用 find,调用该方法,当它返回一个数组时,您可以使用 size/count/length 来获得总数元素:

Users.find(id: current_user.id)&.last_viewed&.length

&amp; 用于避免 NoMethodError 异常,以防数据库中不存在具有该 ID 的用户并且find 返回 nil。

【讨论】:

    猜你喜欢
    • 2012-09-21
    • 1970-01-01
    • 2012-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-10
    • 1970-01-01
    相关资源
    最近更新 更多