2015-10-16 40 views
1

我有这些疑问:提高两个类似的查询

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

+0

哪些错误与您的解决方案的结果?你有错误还是什么? – nsave

回答

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

正确和'Rails'的做法。 –

+0

这只是完美!我怎么没有想过呢? –

1

这是一直以来我的工作on 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