Как подсчитать элементы в массиве SQL с помощью Ruby в запросах Rails - PullRequest
1 голос
/ 04 августа 2020

Я хочу подсчитать количество элементов в массиве, указывающем c на идентификатор пользователя, а затем отобразить это число. Массив 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 - это метод, а не часть таблицы Users.

Я знаю, как использовать реальный SQL, но эти запросы в Ruby on Rails сбивают с толку. По сути, я хочу превратить этот код SQL во что-то, что работает на Ruby.

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

1 Ответ

1 голос
/ 04 августа 2020

last_viewed - столбец в таблице пользователей, который действует как метод в экземпляре модели User. Если у вас нет экземпляра этого класса, вы не можете использовать этот метод, если не определили свой собственный.

Чтобы получить общее количество last_viewed от пользователя с идентификатором, равным current_user.id, вы можете просто используйте find, вызовите этот метод и, поскольку он возвращает массив, вы можете использовать size / count / length, чтобы получить общее количество элементов:

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

& используется, чтобы избежать исключения NoMethodError в случае пользователь с таким идентификатором не существует в базе данных и find возвращает ноль.

...