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)