В приложении Rails, как я могу запросить последний экземпляр конкретной модели, имеющей несколько условий?
class User
has_many: tests
class TestAttempt
belongs_to: user
belongs_to: test
class Test
has_many: test_attempts
Проблема здесь в том, что каждый пользователь может проходить один тест любое количество раз. Каждая попытка test_attempt хранится в TestAttempt
. Но мне нужно запросить только последнюю попытку конкретного теста. Итак, процесс такой:
Find TestAttempt by user_id ---> Something like this ---> TestAttempt.where(user_id: user_id)
Then find the test_id's of the above query.
Then get the last instance of the TestAttempt for each Test for each User
Итак, мой вывод может быть примерно таким:
user1: test_1-last-attempt-marks: 28, test_2-last-attempt-marks-30
user2: test_1-last-attempt-marks: 18, test_2-last-attempt-marks-40
Прямо сейчас я запрашиваю базу данных и добавляю результаты в массив для конкретного пользователя, а затем перебираю каждый элемент массива и беру последний экземпляр значения следующим образом:
def get_test_marks(user_id)
tests = Test.where(user_id: user_id).to_a
tests.each do |test|
#check the name and and add to array if not present, if present then delete the existing one and add new one until last for each test
end
Или
def get_test_marks(user_id)
test_attempts = TestAttempt.where(user_id: user_id).select('distinct test_id, marks')
Есть ли способ запросить непосредственно из базы данных последнюю попытку каждого теста для конкретного пользователя вместо написания кода вышеописанным способом?
Здесь я получу только за один тест. Мне нужны последние результаты уникальных тестов, таких как test1, test2, test3 и т. д. для каждого пользователя. Например: User1 might have taken test1-2 times, test2-3 times and test3-4 times
. Так что хочу 2nd instance of test1, 3rd instance of test2, 4th instance of test3 for user1 and so on for other users
.
Теперь я добавил больше деталей к вопросу.
Test.all.group_by { |test|
test.user_id}.flat_map { |test, data| data.sort_by(&:created_at).last(1)
}
Попробуйте этот обновленный код
Попробуйте этот Test.where(user_id: user_id).order(created_at: :asc).last(1). Если не сработало, дайте мне знать.