2015-10-16 3 views
1

Je ces requêtes:Améliorer deux requêtes similaires

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) 

Ils sont presque les mêmes, à l'exception du minimum et maximum.
J'essaie d'améliorer ce code, mais je n'ai aucune idée sur la façon de changer cela.
Je pensais que quelque chose comme

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) 

mais pour une raison quelconque, cela ne fonctionne pas. On dirait que ActiveRecord exécute la requête pour le base, puis s'exécute à nouveau sur initial_date.

+0

Quel est le problème avec votre solution? Avez-vous une erreur ou quoi? – nsave

Répondre

3

Avez-vous envisagé l'aide d'un 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') 
} 

qui peut être utilisé comme:

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

Correct et "Rails" façon de le faire. –

+0

c'est juste parfait! comment se fait-il que je n'y aie pas pensé? –

1

Il est a longtemps que je travaille sur Rails, mais je voudrais prendre coup.

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') 

Il retournera un résultat avec 2 colonnes, initial_date et last_date