#ruby-on-rails #activerecord
#ruby-on-rails #activerecord
Вопрос:
У меня есть система голосования.
В принципе, у меня есть задача со многими элементами задачи. У каждого элемента задания много фотографий, и люди должны проголосовать за эти фотографии. Итак, я записываю эти голоса, которые принадлежат фотографии. У каждого голоса есть отпечаток пальца, который идентифицирует избирателя. Таким образом, с помощью отпечатка пальца я могу получить все голоса пользователя. Теперь: я должен получить идентификаторы в виде массива элементов запроса, за которые пользователь уже проголосовал из данного запроса.
Я передаю два параметра: отпечаток пальца, который я использую для возврата массива голосов, и вызов.
У меня есть эти модели
class Challenge < ApplicationRecord
has_many :challenge_items
has_many :photos, :through => :challenge_items
belongs_to :season
end
class ChallengeItem < ApplicationRecord
belongs_to :challenge
has_many :photos
has_many :votes, :through => :photos
end
class Photo < ApplicationRecord
belongs_to :challenge_item
has_many :votes
end
class Vote < ApplicationRecord
belongs_to :photo
end
Голосование принадлежит фотографии, которая принадлежит вызову.
Мне нужно создать наиболее эффективный запрос, который вернет мне массив идентификаторов элементов запроса из массива голосов.
Ассоциация belongs_to не может иметь параметр :through
Теперь я использую
challenge_photo_ids = Challenge.find(params["challenge"]).photos.map(amp;:id)
чтобы получить идентификаторы фотографий задачи
get_already_voted = Vote.where(voter_string: params["voter_string"]).map(amp;:photo_id)
Чтобы получить идентификаторы фотографий из голосования
@already_voted = challenge_photo_ids amp; get_already_voted
Чтобы получить фотографии задачи с голосованием.
Но теперь из этих фотографий мне нужно также извлечь элементы вызова…
Любой намек?
Ответ №1:
Я, вероятно, не понял, чего вы хотите. Разве это не так? Учитывая votes_ids
ChallengeItem.joins(photos: :votes).
where(challenge_id: challenge_id, votes: {id: votes_ids}).
distinct.pluck(:id)
Это то, что я получаю из этого предложения I need to build the most efficient query that return me the challenge items id array from a vote array
Комментарии:
1. ДА… но чтобы получить vote_ids, которые мне нужно использовать
votes_ids = Vote.where(voter_string: "21e8177a963f0422cb12e9f452faf3c4").map(amp;:id)
, и с вашим запросом у меня есть идентификаторы всех проголосовавших элементов вызова, но мне нужны только элементы вызова, которые принадлежат данному вызову! Итак, ваш запрос в порядке, но мне нужно добавить еще два запроса…2. ну, просто добавьте еще одно предложение к where с идентификатором вызова
3. Используйте pluck, это быстрее:
votes_ids = Vote.where(voter_string: "21e8177a963f0422cb12e9f452faf3c4").pluck(:id)
4. кроме того, не могли бы вы добавить voter_string в мой запрос и вообще избежать этого запроса?
5. Что-то вроде
ChallengeItem.joins(photos: :votes). where(challenge_id: challenge_id, votes: {voter_string:"21e8177a963f0422cb12e9f452faf3c4"}). distinct.pluck(:id)