0

У меня есть две модели ActiveRecord: Пользователь и Курс. Которые связаны следующим образом:Rails activerecord query with has_many принадлежит_от ассоциации

class User < ActiveRecord::Base 
    has_many :courses 
end 

class Course < ActiveRecord::Base 
    belongs_to :user 
end 

Теперь мой вопрос: как я могу получить последний курс каждого пользователя?

Я попробовал следующее:

courses = Array.new 
User.find_each { |u| courses << u.courses.last } 

Но я под сомнение его производительность. Поэтому поиск лучшего решения с хорошей производительностью.

Заранее спасибо.

+0

вам нужно один SQL-запрос, чтобы получить последние курсы всех пользователей сразу, я думаю .. я прав @Ganesh – illusionist

+0

Да, для этого мне нужен один SQL-запрос. @illusionist –

+0

Вы можете решить это, используя соединения и прочее с помощью raw SQL, но я не смог его решить с помощью методов activerecord. Я думаю, что использование 'include' и принятие всего 2 sql-запросов - лучшее решение, поскольку оно менее сложное, чем способ SQL. – Albin

ответ

1

Чтобы получить последний курс каждого пользователя вы можете сделать это:

courses = [] 
User.includes(:courses).find_each { |u| courses << u.courses.last } 
+0

он говорит, что ему нужен SQL-запрос, если его возможно – illusionist

-2

Как и что вы можете узнать последний курс для пользователя

User.find(1).courses.order(name: :ASC).last 

Если вы хотите, чтобы иметь массив :

courses = [] 

User.each do |u| 
    courses << u.courses.order(name: :ASC).last 
end 
1

Я все еще думаю, что было бы проще просто принять 2 запроса. Но я нашел статью, на которую я смотрел, прежде чем решила сделать это в 2-х запросах. Это работает, но это добавляет довольно много сложности.

Rails Associations has_one Latest Record

1

В 2 запросы:

User.select(:id).includes(:courses).each { |u| u.courses.last } 

Не работает, если ваши таблицы слишком большой

1

Другим способом с 1 SQL запрос

Course.all.group_by(&:user_id).map { |_k,courses| courses.last } 
+1

Это определенно не ожидаемое поведение. – Aeradriel

Смежные вопросы