Rails или SQL запрос для получения данных ассоциации пользователей - PullRequest
3 голосов
/ 05 августа 2020

У меня есть три модели с полями ниже (каждое поле после #):

class User < ApplicationRecord
  has_many :user_tags, dependent: :destroy
end

class UserTag < ApplicationRecord
  belongs_to :user
end

class JourneyTag < ApplicationRecord
  belongs_to :journey
end

Я хочу найти все путешествия с тегами, соответствующими тегам пользователя - user.user_tags. Как получить такие данные?

То, что я пытался сделать:

current_user.user_tags.each do |user_tag|
  JourneyTag.where(cms_tag_id: user_tag.cms_tag_id)
end

Что должно дать мне JourneyTag с тем же cms_tag_id, что и user.user_tags, а затем я хочу получить эта коллекция JourneyTag, чтобы найти Путешествие. Но приведенный выше запрос бесполезен, потому что он всегда возвращает некоторый JourneyTag, даже если он не соответствует user_tag.cms_tag_id

1 Ответ

2 голосов
/ 05 августа 2020

Попробуйте:

Journey.joins(:journey_tags).where(journey_tags: { cms_tag_id: current_user.user_tags.pluck(:cms_tag_id) })

Разбивка на части:

current_user.user_tags #=> returns all user tag ids associated 
current_user.user_tags.pluck(:cms_tag_id) #=> gives all associated cms_tag_id in single SELECT `cms_tag_id` query 
journey_tags: { cms_tag_id: current_user.user_tags.select(:cms_tag_id) } #=> executes matching WHERE against JourneyTags
Journey.joins(:journey_tags) #=> filtered JourneyTags joins with Journey

В качестве альтернативы вы можете попробовать следующее с ручным объединением:

Journey.joins(:journey_tags).joins('INNER JOIN user_tags on user_tags.cms_tag_id = journey_tags.cms_tag_id INNER JOIN users on user_tags.user_id = users.id')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...