1

在我最近问的另一个问题中,我得到了一个非常好的答案并且代码工作......但我不知道它为什么工作......现在我有一个类似的问题,但不知道如何解决它...... .?

我有的:

楷模

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 %>

蒂斯

4

2 回答 2

3

你可以这样做

<% 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 %>

更新

更合乎逻辑的变体创建 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 %>
于 2011-04-05T12:05:33.777 回答
1

听起来你只想要相反的结果can_vote_on?,即如果用户不能对答案投票(can_vote_on?返回 false),那么这意味着他们已经投票(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

但由于 DRY 原则,我更喜欢第一个解决方案。

更新

我的否定是错误的。在这种情况下,您正在处理一个特定的答案,而不是所有答案。

在您的模型中,您需要以下内容:

def voted_answer? (answer)
    answer.votes.where('votes.user_id = ?', id).exists?
end
于 2011-04-05T11:33:09.747 回答