2016-03-29 9 views
2

で、私は文字列の配列必要はありませ:Railsはクエリや正規表現

a = ['*@foo.com', '*@bar.com', '*@baz.com'] 

を私は、電子メールは、上記のドメインのいずれかに存在しないすべてのレコードを取得するので、私のモデルを照会したいと思います。

私が行うことができます:

Model.where.not(email: a) 

リストは、文字列のリストになりますが、リストは、正規表現の多い場合。

答えて

2

データベースアダプタによって異なります。おそらく、生のSQLを使用してこのタイプのクエリを書くことができます。たとえば、あなたができるのpostgresに:

Model.where("email NOT SIMILAR TO '%@foo.com'") 

私はあなたがそれをやるべき正確にどのようthatsのことを言っていないよ、それはあなたのデータベースのクエリ言語を見て、何があなたのニーズにマッチするかどうかを確認する価値があります。

例では、マッチャを1つの文字列として結合し、それをクエリに挿入する必要があります。

a = ['%@foo.com', '%@bar.com', '%@baz.com'] 

Model.where("email NOT SIMILAR TO ?", a.join("|")) 
+0

Postgresと私はnot not like notationを認識しています - 文字列の配列しかないので、単に**'%@foo.com'**の中に貼り付けることはできません。 – Kocur4d

+0

Postgresでは、 '|'演算子を使ってlikeに複数の引数を使うことができるので、a.join( '|')を補間して、パターンがポストグラム形式であることを確認してください。 – tpbowden

+0

ちょっと読んだら「類似」のように見えます。私は答えを更新しました – tpbowden

0

使用このコード:

a = ['%@foo.com', '%@bar.com', '%@baz.com'] 
Model.where.not("email like ?",a.join("|")) 

配列に%から*を交換してください。

+0

PostgreSQLを使用しており、データに大文字と小文字が混在している場合は、「LIKE」ではなく「ILIKE」を使用する必要があります。 –