Как я могу получить все ответы конкретного пользователя на сообщения по определенной теме

У меня есть пользователь, микросообщение и модель ответа.

У пользователя много микросообщений и много ответов.

У микросообщений есть теги, использующие в качестве тега самоцвет.

Мне нужно узнать количество ответов пользователя на микросообщения, которые помечены определенным тегом. Чтобы было понятно, например, сколько ответов пользователь 1 дал микросообщениям на "упражнение"

Существует некоторый базовый синтаксис ruby ​​и логика отношений, которые мне не хватает. Это то, что у меня есть в моей пользовательской модели.

  def user_responses_on_topic tag
      microposts = self.microposts.tagged_with(tag, :on => :tags)
      responses_count = 0
      microposts.each do |micropost|
          count = micropost.responses.where("user_id = :user_id", user_id: self.id).size
          responses_count  = responses_count + count
     end
   end

Это дает мне ценность, но я знаю, что это неправильно, потому что, когда я добавляю ответы на определенную тему, ценность пользователей не увеличивается.

Я уверен, что есть простой "рубиновый" способ получить это с помощью

   responses = user.microposts.responses 

Но мне нужно знать, как добавить теговую логику на микросообщениях в этот код

Я немного подтянул, но все же не удача. Отдельные компоненты этого кода работают, но я не могу заставить все это работать вместе

 def user_responses_on_topic(interest)
    microposts = Micropost.tagged_with(interest, :on => :tags, :any => true)
    responses ||= 0
    microposts.each do |micropost|
    responses += micropost.responses.where("user_id = :user_id", user_id: self.id).size
   end
 end

РЕДАКТИРОВАТЬ:

Это работает

def user_responses_on_topic(interest)
   microposts = Micropost.tagged_with(interest, :on => :tags, :any => true)
   count = 0
     microposts.each do |micropost|
     responses = micropost.responses.size
     count = count + responses
    end
   count
end

Но должен быть лучший способ Rails (это пахнет PHP)

Есть идеи?

2 ответа

Вы должны быть в состоянии сделать подсчет в одном запросе, как это:

microposts.tagged_with(tag, on: :tags).joins(:responses).where(responses: {user_id: id}).count

Если все компоненты работают независимо, это может быть так же просто, как добавить строку в конец вашего метода: responses, После .each цикл выполняется, он возвращает исходный массив (а не значение, которое вы изменили в цикле). Так как вы хотите вернуть номер, хранящийся в responsesвы хотите, чтобы эта переменная была последней строкой вашего метода.

Другие вопросы по тегам