控制器计数关系中的自引用查找

时间:2011-06-11 04:46:51

标签: ruby-on-rails ruby-on-rails-3 find self-reference

我在提取一组与用户自我引用相关的记录时遇到了麻烦,以便在用户的“展示”页面上显示这些记录。

以下是这个想法:

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

现在,我只需要显示overall_positively_connected_to(@user)的用户(即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)完全不熟悉,所以可能做了一些天真的事情。

任何帮助都会很棒。

1 个答案:

答案 0 :(得分:1)

所以我说你有3个模特

  • 用户(id,名称)
  • PositiveConnection(user_a_id,user_b_id)
  • NegativeConnection(user_a_id,user_b_id)

或类似的东西。

我想你只想要2个型号 为方便起见,我将把关系重命名为“from_user”和“to_user”

  • 用户(id,名称)
  • 连接(值:整数,from_user_id,to_user_id)

对于负数,值为-1 和+为积极的。

现在我们可以做点什么了 (注意:你需要弄清楚确切的语法,例如:foreign_key,和:source,and stuff)

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