まず、Railsv3.2.9とSqueel1.0.13を使用しています。これが、私がやろうとしていることです。
名前、生年月日(dob)、社会保険番号(sin)の3つの識別情報のいずれかを使用してクライアントを検索したいと思います。結果セットには、条件のORである識別子のいずれかを持つレコードが含まれている必要があります。私は以前にSqueelでこれを行ったことがあり、次のようになります。
scope :by_any, ->(sin, name, dob){ where{(client.sin == "#{sin}") | (client.name =~ "%#{name}%") | (client.dob == "#{dob}")} }
すべての識別子を提供する限り、これは正常に機能します。しかし、私が名前しか持っていない場合はどうなりますか?上記のスコープの結果は次のとおりです。
SELECT "clients".* FROM "clients" WHERE ((("clients"."sin" IS NULL OR "clients"."name" ILIKE '%John Doe%') OR "clients"."dob" IS NULL))
これには、sinがnullであるクライアントのセットとdobがnullであるクライアントのセット、および「JohnDoe」のような名前の要求されたクライアントのセットが含まれます。
where
したがって、条件付きでブロックに句を追加する試みを入力してください。最初は、nilを使用して値を確認しようとしましたか?方法:
def self.by_any (sin, name, dob)
where do
(clients.sin == "#{sin}" unless sin.nil?) |
(clients.name =~ "%#{name}" unless name.nil?) |
(clients.dob == "#{dob}" unless dob.nil?)
end
その結果:
SELECT "clients".* FROM "clients" WHERE ('t')
その「t」との関係など、他の多くの質問を提起しますが、それは正接です。
各順列のwhere句を記述する以外に、条件付きで句を追加できる方法はありますか?