改进两个类似的查询

时间:2015-10-16 12:58:45

标签: ruby-on-rails ruby ruby-on-rails-4 activerecord

我有这些疑问:

initial_date = NewUser.joins(:interactions)
               .where('interactions.interaction_sub_type in (?)', types)
               .where('interactions.interaction_type in (?)', actions)
               .limit(1000).order('users.id asc').minimum(:updated_at)

last_date = NewUser.joins(:interactions)
            .where('interactions.interaction_sub_type in (?)', types)
            .where('interactions.interaction_type in (?)', actions)
            .limit(1000).order('users.id asc').maximum(:updated_at)

minimummaximum外,它们几乎相同 我试图改进这个代码,但我不知道如何改变它。
我想到了像

这样的东西
base = NewUser.joins(:interactions)
                   .where('interactions.interaction_sub_type in (?)', types)
                   .where('interactions.interaction_type in (?)', actions)
                   .limit(1000).order('users.id asc')
initial_date = base.minimum(:updated_at)

但由于某种原因,这不起作用。好像ActiveRecord执行base的查询,然后在initial_date上再次执行。

2 个答案:

答案 0 :(得分:3)

您考虑过使用scope

吗?
# in your `new_user` Model
scope :with_interactions, ->(types, actions) {
  where('interactions.interaction_sub_type in (?)', types).
    where('interactions.interaction_type in (?)', actions).
    limit(1000).order('users.id asc')
}

可以使用:

initial_date = NewUser.with_interactions(types, actions).minimum(:updated_at)
last_date    = NewUser.with_interactions(types, actions).maximum(:updated_at)

答案 1 :(得分:1)

自从我在Rails上工作已经很长时间了,但是我想尝试一下。

NewUser.joins(:interactions)
       .select("MIN(updated_at) AS initial_date, MAX(updated_at) AS last_date")
       .where('interactions.interaction_sub_type in (?)', types)
       .where('interactions.interaction_type in (?)', actions)
       .limit(1000).order('users.id asc')

它将返回包含2列initial_datelast_date

的结果