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

时间:2014-12-08 00:03:04

标签: ruby-on-rails neo4j neo4j.rb pluck

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

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。假设我试图采摘事件,用户和关系。我需要对每个人采取不同的行动。

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

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

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

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

更新

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

@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

2 个答案:

答案 0 :(得分:2)

我还想提出几点意见。您应该能够使用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)

答案 1 :(得分:1)

首先,如果您正在使用宝石的v4,请使用rel_where代替where,并为您的关系添加字符串!

您应该能够将您的摘要更改为pluck(:e, 'COLLECT(u)', 'COLLECT(rel)'),并且它会为您提供大量的事件,用户和相关信息,这些信息都基于事件分组在父数组中。它的组织方式如下:

  [
    [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,用户的索引将与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 %>.<br />
  <% end %>
<% end %>