我在提取一组与用户自我引用相关的记录时遇到了麻烦,以便在用户的“展示”页面上显示这些记录。
以下是这个想法:
用户(current_user
)对其他两个用户(user_a
和user_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)完全不熟悉,所以可能做了一些天真的事情。
任何帮助都会很棒。
答案 0 :(得分:1)
所以我说你有3个模特
或类似的东西。
我想你只想要2个型号 为方便起见,我将把关系重命名为“from_user”和“to_user”
对于负数,值为-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