gpt4 book ai didi

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

转载 作者:数据小太阳 更新时间:2023-10-29 07:42:46 26 4
gpt4 key购买 nike

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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com