加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – 为什么总是这样?轨道

发布时间:2020-12-17 01:44:57 所属栏目:百科 来源:网络整理
导读:def follows(follower,followed)follow = Follows.where("follower = ? AND followed = ?",follower,followed)if follow true else false endend 这是我的观看代码: % if current_user.id == @user.id% pThis is you!/p% else % % if follows(current_user.
def follows(follower,followed)
follow = Follows.where("follower = ? AND followed = ?",follower,followed)
if follow
    true
  else 
    false
  end
end

这是我的观看代码:

<% 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.但它总是回归真实.为什么是这样?

解决方法

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

>模型按惯例是单数的.否则只会让你工作更多.在这种情况下,我建议使用以下作为合适的名称,如“用户有许多关注”.
>外键应以_id结尾.否则只会让你工作更多.所以follower_id和followed_id.
>旨在用于其真/假性质(“query methods”)的方法应以?结尾,以下是?而不是跟随,
>你的if语句是多余的,一旦条件做对了就可以安全地删除.在ruby中,在条件语境中,我们更关心事物是否评估为真/假,而不是它们是字面上的真或假.这意味着除了nil或false之外的任何东西都将是“真实的”.
>您的方法完全取决于User对象已知的信息这一事实表明将它挂在那些对象上更好,例如current_user.follows? other_user.
>您正在复制已使用关联提供给您的行为.

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

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

注意:使用follow_by?这里的方法是使用double dispatch,其防止一个用户的(次要)Law of Demeter violation直接知道另一个用户的关注者的状态.相反,第一个用户对象向第二个用户对象询问一个直接问题(“你跟着我吗?”)并将结果基于答案. (它本身也可能是一种有用的方法.)

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读