1

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

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)

目标是获得eventsstart_date 不到一天的时间。假设我试图提取事件、用户和关系。我需要对每个执行不同的操作。

我需要为每个用户获取所有信息并usersevent每个用户执行电子邮件操作。在该操作中,电子邮件需要有权访问该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使用此查询定义。

4

2 回答 2

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)
于 2014-12-08T13:38:29.510 回答
1

首先,如果您使用的是 gem 的 v4,请使用字符串来rel_where代替where您的关系!

您应该能够将pluck(:e, 'COLLECT(u)', 'COLLECT(rel)')您的 pluck 更改为,它将为您提供大量事件、用户和 rels,所有这些都根据事件分组在父数组中。它会这样组织:

  [
    [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 %>
于 2014-12-08T00:22:52.103 回答