Как лучше всего найти все объекты, у которых есть различные дочерние элементы, которые соответствуют определенным идентификаторам атрибутов?
Возьмите следующие модели:
Модели высшего уровня:
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
?