Лучший способ обрабатывать ActiveRecord, где предложения с тремя типами объединений - PullRequest
0 голосов
/ 05 ноября 2018

Как лучше всего найти все объекты, у которых есть различные дочерние элементы, которые соответствуют определенным идентификаторам атрибутов?

Возьмите следующие модели:

Модели высшего уровня:

class InstagramPost < ApplicationRecord
  has_many :instagram_post_hashtags
  has_many :instagram_post_mentions
  has_many :instagram_post_locations
end

class InstagramHashtag < ApplicationRecord
  has_many :instagram_post_hashtags
  has_many :instagram_posts, through: :instagram_post_hashtags
end

class InstagramMention < ApplicationRecord
  has_many :instagram_post_mentions
  has_many :instagram_posts, through: :instagram_post_mentions
end

class InstagramLocation < ApplicationRecord
  has_many :instagram_post_locations
  has_many :instagram_posts, through: :instagram_post_locations
end

Соединения:

class InstagramPostHashtag < ApplicationRecord
  belongs_to :instagram_hashtag
  belongs_to :instagram_post
end

class InstagramPostLocation < ApplicationRecord
  belongs_to :instagram_location
  belongs_to :instagram_post
end

class InstagramPostMention < ApplicationRecord
  belongs_to :instagram_mention
  belongs_to :instagram_post
end

Теперь скажите, что у меня есть три массива идентификаторов:

instagram_hashtag_ids = [12,20,23]
instagram_location_ids = [4,12,30]
instagram_mention_ids = [121,21,31]

Если бы я хотел найти все InstagramPost, которые имеют InstagramPostHashtag, InstagramPostLocation и InstagramPostMention, которые должны соответствовать всем вышеуказанным идентификаторам массива; Я думал, что могу сделать что-то вроде:

@instagram_posts = InstagramPost.joins(:instagram_post_hashtags).where("instagram_post_hashtags.instagram_hashtag_id IN (#{instagram_hashtag_ids})")

Затем возьмите эти результаты и выполните поиск по следующему массиву:

@instagram_posts = @instagram_posts.joins(:instagram_post_locations).where("instagram_post_locations.instagram_location_id IN (#{instagram_location_ids})")

и так далее ...

Это кажется довольно плохим способом сделать это, потому что если в массиве нет идентификаторов, он вернется пустым. Фактически, в большинстве случаев он возвращается без результатов, даже если во всех массивах есть идентификаторы, и есть данные, отражающие это (может быть, проблема с PostgreSQL?).

Как лучше всего запросить InstagramPost?

1 Ответ

0 голосов
/ 05 ноября 2018

Для получения всех InstagramPost с таблицами соединений, соответствующих заданным массивам идентификаторов:

@instagram_posts = InstagramPost.joins(
  :instagram_post_hashtags,
  :instagram_post_mentions,
  :instagram_post_locations
).where(
  instagram_post_hashtags: { instagram_hashtag_id: instagram_hashtag_ids },
  instagram_post_locations: { instagram_location_id: instagram_location_ids }, 
  instagram_post_mentions: { instagram_mention_id: instagram_mention_ids }
)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...