2014-12-08 4 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 где start_date меньше в течение дня. Гипотетически я пытался вырвать событие, пользователя и отношения. Мне нужно делать разные действия с каждым.

Мне нужно получить все 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 

Update:

Включение ответы, у меня есть что-то вроде этого без вычищен метода времени еще. Я добавил в поиск пользователя, так как мне нужно будет учитывать это позже в функции электронной почты. Поэтому я не уверен, что более эффективно включать его в запрос и делать его вне каждого пользователя.

@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, все сгруппированные в родительские массивы на основе события. Было бы быть организовано так:

[ 
    [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") .users (: u) .rel_where (напомнил : false) .params (one_day_p: one_day, current_time: time) .pluck (: e, 'COLLECT (u)', 'COLLECT (rel)') 'Он не знает, что' rel' находится в коллекции. Он говорит 'rel not defined'. Я добавил изменение к тому, что хочу изменить, на – Clam

+0

'.users (: u,: rel)' – subvertallchris

+0

Вы должны, вероятно, сделать ')/{one_day_p}) <{one}' и добавить 'one: 1' в свой params тоже. : -/ – subvertallchris

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

Чтобы быть ясным, я по-прежнему очень поддерживаю подход «собирать», упомянутый Крисом, и мы надеемся реализовать активную загрузку, чтобы вы могли сделать это посредством вызова метода объекта в ближайшее время –

+0

Наконец-то я вернулся, чтобы вернуться к этой задаче. Я действительно не понял, где добавлен новый метод цепочки запросов, но я попытаюсь проверить документы, чтобы узнать больше об этом. – Clam

+0

Это довольно новый (я думаю, что он попал в последнюю версию исправления 3.0.x, но он, вероятно, должен был дождаться малой или основной версии). В основном это просто позволяет повторно использовать части цепочки запросов в различных запросах. Просмотрите это сообщение в блоге об ActiveRecord, которое очень похоже: http://blog.plataformatec.com.br/2013/02/active-record-scopes-vs-class-methods/ –

 Смежные вопросы

  • Нет связанных вопросов^_^