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)endyeaanswer
未在问题上定义,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)endyeaanswer
未在问题上定义,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没有定义一个模型或方法