Neo4j gem – 采集多个节点/关系

这可能是不可能的,因为它现在,但我有这样的查询

events = Event.as(:e).where("(( e.date_start - {current_time} )/{one_day_p}) < 1 ").users(:u, :rel).where("rel.reminded = {reminded_p}" ).params(reminded_p: false, one_day_p: one_day, current_time: time).pluck(:e,:u, :rel)

目标是获取start_date少于一天的events 。 假设我试图采取事件,用户和关系。 我需要对每个人采取不同的行动。

我需要为每个event获取所有users并为每个用户执行电子邮件操作。 在该操作中,电子邮件需要能够访问该event

接下来,我需要将rel.reminded属性更新为true

有没有办法同时采取所有这些能够组织和执行这些任务? 我开始单独做这个,但我必须进行额外的查询才能实现。 例如

events = Event.as(:e).where("(( e.date_start - {current_time} )/{one_day_p}) < 1 ").users(:u, :rel).where("rel.reminded = {reminded_p}" ).params(reminded_p: false, one_day_p: one_day, current_time: time).pluck(:e)

然后我必须

 events.each do |event| # do stuff end # do another query that is associated and do more stuff 

更新:

结合答案,我有这样的事情没有清理时间方法。 我添加了搜索用户的位置,因为我需要在稍后的电子邮件function中考虑这一点。 所以我不确定将它包含在查询中是否更有效,而不是在每个用户之外进行。

 @collection = Event.as(:e).where("(( e.date_start - {current_time} )/{one_day_p}) < 1 ").users(:u).where(setting_reminder: true).rel_where(reminded: false ).params(one_day_p: one_day, current_time: time).pluck(:e, 'COLLECT(u)', 'COLLECT(rel)') 

但是此查询未定义rel

首先,如果您使用的是gem的v4,请使用rel_where而不是使用字符串表示您的关系!

你应该能够改变你的采摘pluck(:e, 'COLLECT(u)', 'COLLECT(rel)')它会给你一大堆可以在父arrays中分组的事件,用户和相关信息。基于事件。 它的组织方式如下:

  [ [event1, [user1a, user1b, user1c], [rel1a, rel1b, rel1c]], [event2, [user2a, user2b, user2c], [rel2a, rel2b, rel2c]] ] 

每个rel的位置与其用户匹配,因此rel1a是事件和user1a之间的关系。

您可以将其设置为@collection = my_big_query ,然后执行@collection.each do |event, users, rels| 在你看来循环。 您each_with_index用户执行each_with_index ,并且用户的索引将对应于rels的位置。 它看起来像:

 <%= @collection.each do |event, users, rels| %> <%= event.name %> <% users.each_with_index do |user, i| %> <%= user.name %> said they were attending at <%= rels[i].confirmed_at %>.
<% end %> <% end %>

我还想提出几点意见。 您应该能够使用ActiveSupport使查询的一部分更容易,如下所示:

 Event.as(:e).where("date_start < {date_threshold}").params(1.day.from_now) 

另外,为了减少混乱,我没有看到放置.where("rel.reminded = false") (或使用rel_where(reminded: false)克里斯建议的任何问题)。 这不是从用户传入的数据,并且在您调用查询时不会在不同时间更改,因此它应该同样有效。

您还可能希望使用gem的v4中的新查询链接来定义这样的unreminded_users方法:

 class Event def self.unreminded_users all.rel_where(reminded: false) end end 

我实际上没有尝试在查询链中像这样做一个rel_where ,但我怀疑它会起作用。 然后你就会有这个:

 Event.as(:e).where("e.start_date < {date_threshold}").params(date_threshold: 1.day.from_now) .users(:u, :rel).rel_where(reminded: false) .pluck(:e,:u, :rel)