Ruby rails3中的查询

Ruby rails3中的查询,ruby,ruby-on-rails-3,rails-models,Ruby,Ruby On Rails 3,Rails Models,在我最近问的另一个问题中,我得到了一个非常好的答案,代码运行正常。。。但我不知道为什么它会起作用。。。现在我有一个类似的问题,但不知道如何解决它 我所拥有的: 模型 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.answer

在我最近问的另一个问题中,我得到了一个非常好的答案,代码运行正常。。。但我不知道为什么它会起作用。。。现在我有一个类似的问题,但不知道如何解决它

我所拥有的:

模型

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
在我的问题观点中,我想在当前使用的_对具体答案进行投票后,将文本加粗。那么,我该如何完成这项工作:

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



Thijs

听起来你只想得到与
可以投票吗?
相反的结果,即如果用户不能对答案投票(
可以投票吗?
返回false),那么这意味着他们已经投票了(
投票了吗?
在这种情况下应该返回true),反之亦然

解决此问题的一种方法是让
投票决定答案?
返回
可以投票决定的否定项

def voted_answer? (question)
    !can_vote_on? question
end
当然,您也可以使用
can\u vote\u 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

听起来你只是想得到与
can\u vote\u on?
相反的结果,也就是说,如果用户不能对答案投票(
can\u vote\u on?
返回false),那么这意味着他们已经投票了(在这种情况下,
voated\u answer?
应该返回true),反之亦然

解决此问题的一种方法是让
投票决定答案?
返回
可以投票决定的否定项

def voted_answer? (question)
    !can_vote_on? question
end
当然,您也可以使用
can\u vote\u 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
你可以这样做

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


更新

更符合逻辑的变体由用户投票创建?课堂答疑功能

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 %>
课堂答案
def由用户投票?(用户)
voits.where('voates.user_id=?',user.id.)是否存在?
终止
终止

您可以这样做

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


更新

更符合逻辑的变体由用户投票创建?课堂答疑功能

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 %>
课堂答案
def由用户投票?(用户)
voits.where('voates.user_id=?',user.id.)是否存在?
终止
终止



谢谢,但它不起作用。。。现在我得到了所有粗体的结果,因为查询会检查是否存在vots.user\u id。。。我只知道当前的用户id投票答案…@Thijs-gotcha,我不确定那个电话中的id来自哪里。在我展示的第二个示例中,您是否尝试过用current_user.id替换id?我想
可以投票吗?
也使用了当前用户的id。我尝试了什么,但始终出现未定义的方法错误:def vote\u on?(问题)问题。答案。联接(:投票)。其中('voates.user_id=?',current_user.id)endyea
answer
未在问题上定义,
answers
为。如果要从for循环中传入
答案
,请停止
@question
@Thijs-没问题,我很高兴它成功了。所以在你看来,你是在循环问题的所有答案。然后将每个答案传递到
投票答案?
。此方法接受answer参数并获得其投票(通过db查询),然后使用当前用户的id查找该答案上的任何投票。您可以简单地调用“id”,因为它是通过任何对象可用的方法,并且由于您正在对当前用户调用
投票的\u答案?
,您正在检查当前用户的id。如果在给定当前用户的情况下存在对该答案的投票,则您知道该答案就是所选的答案。谢谢,但它不起作用。。。现在我得到了所有粗体的结果,因为查询会检查是否存在vots.user\u id。。。我只知道当前的用户id投票答案…@Thijs-gotcha,我不确定那个电话中的id来自哪里。在我展示的第二个示例中,您是否尝试过用current_user.id替换id?我想
可以投票吗?
也使用了当前用户的id。我尝试了什么,但始终出现未定义的方法错误:def vote\u on?(问题)问题。答案。联接(:投票)。其中('voates.user_id=?',current_user.id)endyea
answer
未在问题上定义,
answers
为。如果要从for循环中传入
答案
,请停止
@question
@Thijs-没问题,我很高兴它成功了。所以在你看来,你是在循环问题的所有答案。然后将每个答案传递到
投票答案?
。此方法接受answer参数并获得其投票(通过db查询),然后使用当前用户的id查找该答案上的任何投票。您可以简单地调用“id”,因为它是通过任何对象可用的方法,并且由于您正在对当前用户调用
投票的\u答案?
,您正在检查当前用户的id。如果在给定当前用户的情况下存在对该答案的投票,则您知道该答案就是所选的答案。哇,它起作用了。它需要投票。。。但是你能解释一下它为什么起作用吗?好的,我明白了!!您正在将vote.id与vote.user_idanswer包含voits的答案_id进行比较。voits是指用户。如果current_user.id==voit.user_id-这意味着这个用户对这个答案的voit这个代码不起作用,OP没有定义一个模型或方法