如果记录有两个条件返回true,那么如何获取Rails 4呢?

时间:2014-10-18 04:47:15

标签: ruby-on-rails postgresql helper

我正在设置我的投票系统,并尝试拥有一个帮助模型,以便我可以检查用户是否已投票购买了一张卡。我是铁杆的新手,似乎无法想出这个。

如何让模型检查对user_idcurrent_user的{​​{1}}的记录进行投票?

我还试图通过设置card_id变量来限制_cards.html.erb每次迭代多次调用帮助器。不知道如何做到这一点,尝试设置变量只是为每张卡打印true,即使是那些没有投票的卡。

设置变量不起作用,也不是帮助器,因为它始终为真。

cards_controller.rb

voted

_cards.html.erb:

def if_voted(card_id)
  if Vote.where(:user_id => current_user.id, :card_id => card_id) then
    true
  else
    false
  end
end
helper_method :if_voted

在@tadman的帮助下

cards_controller.rb

<td>
  <%= @voted = if_voted(card.id) %>
  <% if @voted == true %>
    <span class="green"><center>
  <% elsif @voted == false %>
    <span class="red"><center>
  <% else %>
    <span class="gray"><center>
  <% end %>
    <%= card.up_votes - card.down_votes %>
  </center></span>
</td>

_cards.html.erb

def if_voted(card_id)
  if Vote.where(:user_id => current_user.id, :card_id => card_id).any? then
    @vote = Vote.find_by(:user_id => current_user.id, :card_id => card_id)
    return @vote.voted
  else
    return nil
  end
end
helper_method :if_voted

谢谢

1 个答案:

答案 0 :(得分:4)

即使该范围不包含任何记录,where方法也始终返回范围。 find_by方法使用相同的选项但返回第一个匹配记录,如果找不到则记录nil

但是,这并不是你想要的。您实际上并不想要检索任何记录,而只是检查它们是否存在。如果存在一个或多个记录,则范围上的any?方法为true,否则为false

您应该将代码更新为:

def if_voted(card_id)
  Vote.where(:user_id => current_user.id, :card_id => card_id).any?
end

值得注意的是关于Ruby风格的一些事情:

  • then子句的末尾使用if,虽然支持,但是无关紧要,通常没有完成。
  • 比较事物== true通常是您的逻辑混淆的标志。如果您关注的是文字true而非逻辑真实,请改用=== true。在这种情况下,关闭足够的计数,因此if (if_voted(...))就足够了。
  • 您的方法返回truefalse,但您有三个条件,就好像您希望有一天maybe弹出一样。
  • if_voted这样的方法名称有点笨拙,特别是在if内使用时。像has_voted?这样的东西通常更符合Ruby和Rails,所以你得到的if (has_voted?(...))读得更好。
  • 更好的方法是将此方法迁移到User类中,这样您就可以删除帮助程序并最终使用if (current_user.has_voted?(card_id))作为表达意图的非常明确的方式。