2017-01-20 3 views
0

J'utilise Rails 5 avec PostGres 9.5. Comment puis-je conditionnellement inclure des arguments dans un finder où clause? Je le ci-dessousComment est-ce que j'inclut conditionnellement des arguments dans un finder where clause?

def self.find_by_name_and_hometown_and_age(user) 
    search_criteria = ["my_objects.user_id is null"] 
    # Name criteria 
    search_criteria.push("upper(my_object_times.name) = ?") 

    # Hometown criteria 
    search_criteria.push("upper(my_object_times.city) = ?") 
    if user.address.state_id 
     search_criteria.push("my_object_times.state_id = ?") 
    end 
    if user.address.country_id 
     search_criteria.push("my_object_times.country_id = ?") 
    end 

    # Age 
    search_criteria.push("date ? + interval '1 year' * my_object_times.age between my_objects.day - interval '1 year' and my_objects.day + interval '1 year'") 

    results = MyObjectTime.joins(:my_object, 
           "LEFT JOIN user_my_object_time_matches on my_object_times.id = user_my_object_time_matches.my_object_time_id").where(search_criteria.join(' and '), 
                                   "#{user.first_name.upcase} #{user.last_name.upcase}", 
                                   "#{user.address.city}", 
                                   "#{user.address.state_id}", 
                                   "#{user.address.country_id}", 
                                   user.dob) 
    end 

Notez que s'il n'y a pas le champ « user.address.state_id » ou champ « user.address.country_id », je ne comprends pas les critères dans la recherche, mais je suis pas clair sur la façon de dire la clause where pour ignorer ces arguments. Je préférerais n'avoir qu'une seule clause where.

Répondre

0

where clauses sont chainable si vous avez juste besoin simple si les déclarations

all_items = MyObjectTime.all 

if some_condition 
    all_items = all_items.where(...) 
end 

if some_other_condition 
    all_items = all_items.where(...) 
end 

Et à la fin all_items comprendront ce que vous voulez.

+0

Est-ce que "MyObjectTime.all" exécute une requête qui récupère tous les objets "MyObjectTime" de la base de données? – Dave

+0

S'il est indépendant, oui, mais pas lorsque vous avez enchaîné plusieurs clauses where. Le db n'est pas appelé jusqu'à ce que quelque chose, généralement la vue, essaie d'accéder à la variable 'all_items'. Donc non, tout n'est pas chargé dans Rails pour commencer. – Iceman

+0

Oh cool donc si les deux conditions dans votre exemple s'avèrent être vraies, serait-ce l'équivalent d'un ET dans les deux clauses where? – Dave