1

为了在用户的“显示”页面上显示这些记录,我很难提取一组与用户自引用相关的记录。

这是想法:

用户 ( ) 对其他两个用户 (和)current_user之间的兼容性进行评分。他们可以对兼容性进行正面或负面评价:将两个用户评为“兼容”会在 user_a 和 user_b 之间创建 a,将他们评为“不兼容”会创建一个. 所以有positive_connection、negative_connection和user的模型。user_auser_bpositive_connectionnegative_connection

现在我只需要显示那些overall_positively_connected_to(@user)(即 where positive_connections_to(@user).count > negative_connections_to(@user).count).

这是我必须去的地方,但我不能再进一步了:

用户型号:

  def overall_positive_connected_to(user)
      positive_connections_to(user).count > negative_connections_to(user).count
  end


  def positive_connections_to(user)
      positive_connections.where("user_b_id = ?", user)
  end     

  def negative_connections_to(user) 
      negative_connections.where("user_b_id = ?", user)
  end

控制器

@user.user_bs.each do |user_b|
  if user_b.overall_pos_connected_to(@user)
    @compatibles = user_b
  end
end

控制器中的代码显然是错误的,但我应该怎么做呢?我对rails(和sql)完全陌生,所以可能做了一些天真的事情。

任何帮助都会很棒。

4

1 回答 1

1

所以我说你有3个模型是对的

  • 用户(ID,姓名)
  • PositiveConnection (user_a_id, user_b_id)
  • 负连接(user_a_id,user_b_id)

或者类似的东西。

我认为您只需要 2 个模型,为方便起见,我将把关系重命名为“from_user”和“to_user”

  • 用户(ID,姓名)
  • 连接(值:整数,from_user_id,to_user_id)

其中 value 为 -1 表示负数,+1 表示正数。

现在我们可以做类似的事情(注意:你需要整理出确切的语法,比如:foreign_key,和:source,等等)

class User

  has_many :connections, :foreign_key => "from_user_id"
  has_many :connected_users, :through => :connections, :source => :to_user

  def positive_connections
    connections.where(:value => 1)
  end

  def negative_connections
    ...
  end

end

但是我们现在也有一个框架来创建一个复杂的 sql 查询(同样你需要填写空白......但类似的东西)

class User

  def positive_connected_users
    connected_users.joins(:connections).group("from_user_id").having("SUM(connections.value) > 0")
  end

end

这不太可行,但对于真正的解决方案来说是一种伪代码

(用纯 sql 术语思考可能会更好)

SELECT users.* FROM users
INNER JOIN connections ON to_user_id = users.id
WHERE  from_user_id = #{user.id}
HAVING SUM(connections.value) > 0
于 2011-06-13T20:37:24.770 回答