只是想在设计和效率方面就此发表意见。
假设你有一个喜欢音乐的社交网络。
如果您有music.users
之类的查询,那么您希望识别您的朋友。在视觉上你想添加一个功能来识别这些朋友,也许你的朋友在他们的个人资料中都有一个明星而且非朋友都是孤身一人。
检查每个用户以确定他们是否是朋友是否真的效率低下/昂贵?替代方法?
答案 0 :(得分:0)
result = music.users(:user)
.optional(:friends, :friend)
.where(neo_id: current_user.neo_id)
.pluck(:user, is_friend: 'friend IS NOT NULL')
这会返回一个元组数组:来自关联的每个用户,以及一个布尔说明他们是否是当前用户的朋友
.optional(:friends, :friend)
就像调用.friends(:friend)
一样,但在cypher中使用OPTIONAL MATCH
代替MATCH
来查询关联。
对于is_friend
部分,转换为RETURN friend IS NOT NULL AS is_friend
。实际上,由于这是pluck
,AS
不是必需的,因此它可能只是.pluck(:user, 'friend IS NOT NULL')
。由于它正在执行OPTIONAL MATCH
,因此查询中的friend
变量(current_user
)仅在结果行中的user
为止时才存在有current_user
的朋友。
您可以做的一件事是帮助理解查询链的作用是调用to_cypher
来查看将生成什么查询。在这种情况下,那将是:
puts music.users(:user)
.optional(:friends, :friend)
.where(neo_id: current_user.neo_id)
.return(:user, is_friend: 'friend IS NOT NULL')
.to_cypher
pluck
是一个返回数组而不是查询链对象的方法,因此在这种情况下我将其替换为return
。