0
私はPostGres 9.5でRails 5を使用しています。条件付きでfinder where節に引数を含めるにはどうすればよいですか?私は「user.address.state_id」フィールドまたは「user.address.country_id」フィールドが存在しない場合、私は、検索中に基準が含まれていないことを条件付きでファインダのwhere句に引数を含めるにはどうすればよいですか?
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
下記の注意を持っているが、私はよどこの句にそれらの引数を無視するように指示するかについては不明です。私は1つのwhere句しか持たないことを好むでしょう。
"MyObjectTime.all"は、データベースからすべての "MyObjectTime"オブジェクトを取得するクエリを実行しますか? – Dave
それはそれ自身のyesの上に立っていますが、複数のwhere句をチェーンしている場合はそうではありません。 dbは何か、通常はビューが 'all_items'変数にアクセスしようとするまで呼び出されません。そうではありませんが、それはすべてRailsにロードされるわけではありません。 – Iceman
ああ、あなたの例の両方の条件が真であることが判明した場合、それは2つのwhere節のANDと等価でしょうか? – Dave