只是想在设计和效率方面对此发表意见。
假设您有一个喜欢音乐的社交网络。
如果您music.users
对这些用户有类似的查询,并且想要识别您的朋友。从视觉上看,您想添加一个功能来识别这些朋友,也许您的所有朋友的个人资料上都有一个星号,而非朋友则独自一人。
检查每个用户是否是朋友真的是低效/昂贵吗?替代方法?
只是想在设计和效率方面对此发表意见。
假设您有一个喜欢音乐的社交网络。
如果您music.users
对这些用户有类似的查询,并且想要识别您的朋友。从视觉上看,您想添加一个功能来识别这些朋友,也许您的所有朋友的个人资料上都有一个星号,而非朋友则独自一人。
检查每个用户是否是朋友真的是低效/昂贵吗?替代方法?
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)
就像 call 一样.friends(:friend)
,但是使用密码而OPTIONAL MATCH
不是 aMATCH
来查询关联。
对于is_friend
部分,这转化为RETURN friend IS NOT NULL AS is_friend
. 实际上,由于这是 a 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
在这种情况下我将其替换为。