У меня есть следующая проблема. Мне нужно сделать массивный запрос таблиц с именами профессионалов, но мне нужно оптимизировать запрос, потому что для каждого профессионала я вызываю связанные таблицы.Запросы с включенными в Rails
Но у меня есть проблема с двумя связанными таблицами: комментариями и тарифами.
Комментарии:
Мне нужно позвонить 3 комментария для каждого профессионала. Стараюсь с:
@professionals.includes(:comments).where(:comments => { type: 0 }).last(3)
Проблема запроса только приносит 3 профессионалов, а не то, что мне нужно, все профессионалы, которые имеют только три замечания типа, где быть равны нулю.
И когда я пытаюсь:
@professionals.includes(:comments).where(:comments => { type: 0 })
В результате только профессионалы (все) комментарии, когда мне нужно все профессиональные или без комментариев. Но если профессионал есть комментарии мне нужно только три последние комментарии, где быть типа равна нулю
Тарифы:
С тарифами У меня аналогичная проблема, в этом случае мне нужно 4 последние тарифы для каждого профессионал. Я стараюсь:
@professionals.includes(:tariffs).last(4)
Но только последние 4 профессионалов.
Модели:
class Comment < ActiveRecord::Base
belongs_to :client
belongs_to :professional
end
class Professionals < ActiveRecord::Base
has_many :comment
end
У меня нет проблем с вашим вторым вариантом. Вы включаете все соответствующие комментарии для всех профессионалов, что хорошо. Если вы хотите получить последние 3 для отдельного профессионала, вы можете вызвать professional.comments.limit (3) или professional.last (3), когда вы зацикливаете профессионалов в своем запросе. Первый возвращает ActiveRecord :: Relation, а один из них - Array. Можете ли вы показать, где вы хотите использовать последние 3 комментария на одного профессионала? –
Вам нужно будет запустить подзапрос в предложении 'WHERE', которое подсчитывает количество комментариев. Однако как это сделать (и что более важно, как это сделать, не убивая производительность), зависит от того, какую RBDMS вы используете. '.last (3)' не работает, поскольку он применяет 'LIMIT' для всего запроса. – max