Эффективный запрос с активной записью для воссоздания belongs_to через

#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)