2017-01-20 17 views
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句しか持たないことを好むでしょう。

答えて

0

where句は文

all_items = MyObjectTime.all 

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

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

そして、最後all_itemsでは、あなたが欲しいものを含まれていますので、もしあなただけのシンプル必要チェーン可能です。

+0

"MyObjectTime.all"は、データベースからすべての "MyObjectTime"オブジェクトを取得するクエリを実行しますか? – Dave

+0

それはそれ自身のyesの上に立っていますが、複数のwhere句をチェーンしている場合はそうではありません。 dbは何か、通常はビューが 'all_items'変数にアクセスしようとするまで呼び出されません。そうではありませんが、それはすべてRailsにロードされるわけではありません。 – Iceman

+0

ああ、あなたの例の両方の条件が真であることが判明した場合、それは2つのwhere節のANDと等価でしょうか? – Dave

関連する問題