这可能是不可能的,因为它现在,但我有一个像这样的查询
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
。
答案 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 %>