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

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

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

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

Мне нужно найти количество ответов пользователя на микросообщения, помеченные определенным тегом. Чтобы было ясно, например, сколько ответов дал пользователь 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)

Любые идеи?


person GhostRider    schedule 29.04.2015    source источник


Ответы (2)


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

person Rob Mulholand    schedule 29.04.2015
comment
Не повезло, не уверен, что это должно иметь значение, поскольку переменная объявлена, но может быть неправильно (и, вероятно, я!) - person GhostRider; 29.04.2015
comment
Вы сказали, что у пользователя много микросообщений и много ответов — значит ли это, что у пользователя много ответов, или у пользователя много микросообщений, а на микросообщение много ответов? Ваш код выглядит так, как будто он предполагает последнее, но если первое усложняет ситуацию (вы хотите построить связь между микросообщениями и ответами, чтобы вы могли проверить, имеет ли микросообщение, к которому принадлежит ответ, определенный тег). - person Rob Mulholand; 29.04.2015
comment
У пользователя много микросообщений и много ответов. Микропост принадлежит пользователю и имеет много ответов. Ответ принадлежит пользователю и принадлежит микросообщению. - person GhostRider; 29.04.2015

Вы должны быть в состоянии сделать подсчет в одном запросе следующим образом:

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