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.
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
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
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