2014-12-08 88 views
1

这是不可能的,因为它是正确的,但现在我有一个像这样Neo4j的宝石 - 采薇多个节点/关系

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,其中起始日期小于查询一天之外。假设我试图采取事件,用户和关系。我需要对每个人采取不同的行动。

我需要为每个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 

更新:

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

@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未与此查询一起定义。

回答

1

首先,如果您使用的是宝石版本v4,请使用rel_where而不是where,并为您的关系使用字符串!

你应该能够改变你的采摘为pluck(:e, 'COLLECT(u)', 'COLLECT(rel)'),它会给你一个事件,用户和rels的大量enumerable,所有事件都归入父数组中。它会组织这样的:

[ 
    [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 %> 
+0

最后回到这个。使用类似于@collection = Event.as(:e).where(“((e.date_start - {current_time})/ {one_day_p})<1”的collect方法).users(:).rel_where(提醒:false).params(one_day_p:one_day,current_time:time).pluck(:e,'COLLECT(u)','COLLECT(rel)')它不知道集合中有什么'rel'。它说'rel没有定义'。我添加了一个编辑,以便将其更改为 – Clam 2014-12-17 08:50:04

+0

'.users(:u,:rel)' – subvertallchris 2014-12-17 16:56:52

+0

您应该可以执行')/ {one_day_p})<{one}'并将'one:1'添加到您的参数也是如此。 : -/ – subvertallchris 2014-12-17 16:57:31

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) 
+0

要清楚,我仍然非常支持Chris提到的'collect'方法,我们希望实现预加载,以便可以通过对象方法调用在不久的将来 – 2014-12-08 13:40:25

+0

我终于回到了这个任务。我并没有真正知道你添加的新查询链接方法在哪里,但我会尝试查看文档以了解更多关于它的信息 – Clam 2014-12-17 08:38:41

+0

这非常新颖(我认为它进入了3.0.x的最新补丁版本,但它可能应该等到小版本或主版本)。基本上它只是让你在各种查询中重用查询链的一部分。看看这篇关于ActiveRecord的博客帖子,它非常类似:http://blog.plataformatec.com.br/2013/02/active-record-scopes-vs-class-methods/ – 2014-12-17 10:44:04