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