ruby-on-rails - 为什么这总是返回 true? rails

标签 ruby-on-rails ruby

def follows(follower, followed)
follow = Follows.where("follower = ? AND followed = ?", follower, followed)
if follow
    true
  else 
    false
  end
end

这是我的 View 代码:

<% if current_user.id == @user.id%>
  <p>This is you!</p>
<% else %>
  <% if follows(current_user.id, @user.id)%>
    <p>You already follow <%= @user.username %>
  <% else %>
    <p><%= link_to "Follow!", follow_path(@user.id) %></p>
   <% end %>
<% end %>

我想检查一个用户是否关注另一个用户,所以写了这个。它接受两个用户 ID,并查询数据库,应该在找到匹配项时返回 true,否则返回 false。但它总是返回 true。这是为什么?

最佳答案

让我们从一些风格和设计问题开始,以实际答案结束:

  1. 按照惯例,模型是单数的。否则只会让你做更多的工作。在这种情况下,我建议使用 Following 作为合适的名称,如“一个用户有很多关注者”。

  2. 外键应以 _id 结尾。否则只会让你做更多的工作。所以 follower_idfollowed_id

  3. 旨在用于真/假性质的方法(“query methods”)应该以 ? 结尾,所以 follows? 而不是 follows,

  4. 您的 if 语句是多余的,可以在条件正确时安全地删除。在 ruby​​ 中,在条件上下文中,我们更关心事物是否求值为真/假,而不是它们是字面上的 true 还是 false。这意味着除 nilfalse 之外的任何内容都将是“真实的”。

  5. 您的方法完全依赖于 User 对象已知的信息这一事实表明,最好将其与那些对象挂起,例如 current_user.follows?其他用户

  6. 您正在复制已经通过使用关联提供给您的行为。

最后,考虑到所有这些因素,答案是:

class User < ActiveRecord::Base
  has_many :followings, :class_name => 'Following', :foreign_key => 'followed_id'
  has_many :followers, :through => 'followings'

  def follows?(other)
    other.followed_by? self
  end

  def followed_by?(other)
    followers.include? other
  end
end

注意:此处使用followed_by? 方法是对double dispatch 的使用防止(次要)Law of Demeter violation一个用户直接了解另一个用户的关注者的状态。相反,第一个用户对象向第二个用户对象询问一个直接问题(“你被我跟踪了吗?”)并根据答案得出结果。 (它本身也可能是一种有用的方法。)

关于ruby-on-rails - 为什么这总是返回 true? rails ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5723351/

相关文章:

ruby-on-rails - Gem, rails 的自定义保存方法

ruby-on-rails - send() 方法的用途是什么?

ruby-on-rails - 在 Ruby on Rails 中,authenticate_with_http_basic 是做什么的?

javascript - 使用不显眼的 Javascript 插入包含 Rails RESTful URL 的元素?

ruby - String#scan 无法捕获所有事件

ruby-on-rails - 未记录的 ActiveRecord bang 方法

ruby-on-rails - Ruby On Rails Rspec 'require' 找不到文件

ruby - 正则表达式匹配组,但组成员除外

ruby - 纤维#alive?没有定义的

mysql - 如何在 mysql 查询中使用字符串数组