Neo4j的宝石 - 采薇多个节点/关系(Neo4j gem - Plucking multiple

2019-10-21 09:18发布

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

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)

我们的目标是获得events ,其中起始日期不到一天的时间。 可以想像我试图拔掉的情况下,用户和关系。 我需要做的,每个不同的动作。

我需要得到所有users的每一个event ,并执行针对每个用户的电子邮件操作。 在这一行动中,电子邮件需要访问该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

更新:

合并的答案,我有这样的事情没有清理时间的方法呢。 我在哪里搜索用户,因为我需要在后面的电子邮件功能因素在增加。 所以,我不知道这是否是更有效的把它列入查询VS做的每用户之外。

@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没有与此查询定义。

Answer 1:

首先,如果你使用的宝石V4,使用rel_where而不是where与你们的关系是一个字符串!

你应该能够改变你的勇气来pluck(:e, 'COLLECT(u)', 'COLLECT(rel)')它会给你的事件,用户和RELS的一大枚举,父阵列的所有分组基于事件。 它会组织这样的:

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

每个相对的位置其用户相匹配,所以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 %>


Answer 2:

我也想帮腔上几个百分点。 您应该能够使用ActiveSupport使查询更容易这样的一部分:

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

此外,为了使它不那么杂乱我没有看到任何把问题.where("rel.reminded = false")或使用rel_where(reminded: false)克里斯建议)。 这不是从用户传递的数据,并没有在当你调用查询不同时代的变化,所以它应该是一样有效。

您可能还需要使用新的查询链接在创业板上市的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)


文章来源: Neo4j gem - Plucking multiple nodes/relationships