запрос в rails3 - PullRequest
       9

запрос в rails3

1 голос
/ 05 апреля 2011

В другом вопросе, который я задавал недавно, я получил действительно хороший ответ, и код сработал ... Но я не знаю точно, почему он работает ... Теперь у меня похожая проблема, но я не знаю, как ее решить это ...

Что у меня есть:

Модель

users
questions (with answer_id)
answers
votes (with answer_id and user_id)

модель для пользователей:

has_many :questions
has_many :votes
def can_vote_on? (question)
    !question.answers.joins(:votes).where('votes.user_id = ?', id).exists?
  end

def voted_answer? (question)
   (what to do here...?) 
  end

модель для вопросов:

belongs_to :user
has_many :answers, :dependent => :destroy
accepts_nested_attributes_for :answers, :reject_if => lambda { |a| a[:text].blank? }, :allow_destroy => true

модель для ответов:

belongs_to :question
has_many :users, :through => :votes, :dependent => :destroy
has_many :votes

модель для голосов:

belongs_to :answer
belongs_to :user

В моем представлении вопросов я хочу сделать текст жирным, когда current_used проголосовал по этому конкретному ответу. Итак, как мне закончить это:

<% for answer in @question.answers %>
 <% if current_user.voted_answer? (@question) %>
  <td>
   <strong><%= answer.text %></strong> 
  </td> 
 <% else %>
  <td>
   <%= answer.text %>
  </td> 
 <% end %>
<% end %>

Тайс

Ответы [ 2 ]

3 голосов
/ 05 апреля 2011

вы можете сделать это

<% for answer in @question.answers %>
  <% if answer.votes.index{|vote| vote.user_id == current_user.id} %>
    <td>
    <strong><%= answer.text %></strong> 
    </td> 
  <% else %>
    <td>
    <%= answer.text %>
    </td> 
  <% end %>
<% end %>

ОБНОВЛЕНИЕ

более логичный вариант create voted_by_user?функция в классе Ответ

class Answer
  def voted_by_user?(user)
    voits.where('votes.user_id = ?', user.id).exists?
  end
end

<% @question.answers.each do |answer| %>
  <td>
    <% if answer.voted_by_user?(current_user) %>
      <strong><%= answer.text %></strong> 
    <% else %>
      <%= answer.text %>
    <% end %>
  </td> 
<% end %>
1 голос
/ 05 апреля 2011

Звучит так, будто вы просто хотите получить противоположный результат can_vote_on?, то есть если пользователь не может проголосовать за ответ (can_vote_on? возвращает ложь), то это означает, что они уже проголосовали (voted_answer? должно вернуть true в этомдело) и наоборот.

Один из способов решить эту проблему - заставить voted_answer? вернуть отрицание can_vote_on:

def voted_answer? (question)
    !can_vote_on? question
end

Или, конечно, вы можете использовать запрос, который вы использовали в can_vote_on? безотрицание:

def voted_answer? (question)
    question.answers.joins(:votes).where('votes.user_id = ?', id).exists?
end

Но я бы предпочел первое решение из-за принципа СУХОЙ.

ОБНОВЛЕНИЕ

Я был неправ в отрицании.В этом случае вы имеете дело с конкретным ответом, а не со всеми.

В вашей модели вам понадобится следующее:

def voted_answer? (answer)
    answer.votes.where('votes.user_id = ?', id).exists?
end
...