在Rails中查询具有条件的最后一个实例

时间:2019-05-29 06:04:43

标签: ruby-on-rails

在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')

是否有一种方法可以直接从数据库中查询特定用户每次测试的最后一次尝试,而不用上述方式编写代码?

1 个答案:

答案 0 :(得分:1)

Test.all.group_by { |test|  
test.user_id}.flat_map { |test, data|  data.sort_by(&:created_at).last(1)
} 

尝试此更新的代码