Попытка получить счет через несколько ассоциаций - PullRequest
2 голосов
/ 20 декабря 2010

Я создал приложение для ответа на вопрос для клиента, очень похожее на StackOverflow. Я не пытаюсь реализовать какую-то систему баллов (например, репутацию SO). Я пытаюсь получить определенное количество записей через ассоциации (которые, я считаю, установлены правильно). В первую очередь я пытаюсь получить подсчет голосов за ответы пользователей. Вот пример.

На странице /views/questions/show я перечисляю все ответы на этот вопрос, вызывая частичный _answer.html.erb. С каждым ответом я получаю информацию о answer.user (имя пользователя, адрес электронной почты и т. Д.), Просто выполняя команду answer.user.username. Я хочу отобразить в виде значка некоторые форматы подсчета общей точки. Поэтому, если User A ответил Question A, рядом с ответом User A я хочу отобразить общее количество всех голосов User A.

Я могу успешно получить счетчик ответов пользователей в /views/answers/_answer.html.erb, выполнив следующие действия:

<%= answer.user.answers.count %>

но когда я пытаюсь расширить этот синтаксис / ассоциацию, чтобы получить количество голосов для всех ответов User A, я получаю неопределенные ошибки метода.

<%= answer.user.answers.votes.count %> 

Здесь мои установки в корне неверны или я что-то упустил.

Это немного сбивает с толку, поэтому дайте мне знать, если вам нужно больше деталей.

UPDATE:

Вот ассоциации:

Ответы

class Answer < ActivRecord::Base
  belongs_to :question
  belongs_to :user
  has_many :votes, :dependent => :destroy
end

Голоса

class Vote < ActiveRecord::Base
  belongs_to :answer
  belongs_to :user
  belongs_to :question
end

Пользователи

class User < ActiveRecord::Base  
  has_many :questions, :dependent => :destroy
  has_many :answers, :dependent => :destroy
  has_many :votes, :through => :answers , :dependent => :destroy
end

Ответы [ 2 ]

3 голосов
/ 20 декабря 2010
<%= answer.user.answers.votes.count %> 

но

answer.user.answers

- это массив ответов, поэтому я полагаю, вы хотели что-то вроде

<%= answer.user.answers[id].votes.count %> 

UPDATE

<% answer.user.answers.each do |answer| %>
    <%= answer.votes.count%>
<% end% >

UPDATE

 <%= (answer.user.answers.map{|x| x.votes.count}).sum%>

Я ЛЮБЛЮ рельсы для таких вещей

1 голос
/ 20 декабря 2010

но когда я пытаюсь расширить этот синтаксис / ассоциацию, чтобы получить количество голосов на все ответы пользователя А, я получаю неопределенные ошибки метода.
Вы можете найти полный список того, что вы можете сделать сuser.answers коллекция здесь (кроме стандартных методов Array / Enumerable).И это только экземпляр коллекции, а не Answer объект, поэтому вы не можете вызывать методы из Answer модели для него.

Вы можете попробовать установить отношение has_many :votes, :through => :answers.( Подробнее см. Здесь ) Хотя я не уверен, что в таком случае сработает :through.
В качестве альтернативы, вы можете создать метод в User модели, чтобы вернуть все Voteобъекты (просто перебирая все ответы)

Но, откровенно говоря, создание орды из Vote объектов просто для их подсчета звучит для меня как ужасная трата ресурсов.

...