0

複数のフィールドでフィルタリングしようとしています。フィールドはENUMリストから取得され、チェックボックスフィールドに入れられ、次に配列に保存されます。 {"status" => ["active"、 "past_due"]}のように、フィルタリングしようとしているもののGETリクエストは次のようになります。私は選択された値でフィルタリングするクエリのスコープを持っています。私は問題がモデルにあると仮定しています。INクエリがフィルタリングしない - Ruby on Rails 4

モデル:

scope :subscription_status, -> (statuses) {where :subscription_status => statuses} 

コントローラ:

@users = User.where(nil) 
@users = @users.subscription_status(params[:statuses]) if params[:statuses].present? 

ビュー(html.haml):

= form_tag root_path, :method => 'get' do 
    - @subscription_statuses.each do |status| 
     = check_box_tag 'statuses[]', status 
     = status 
    = submit_tag "Filter", :name => nil 

@subscription_statusesは、ENUMリストを含んでいます。

他のフィルタも同じ原理で動作しますが、このフィルタは機能していないようです。ページがリロードされ、GETパラメータが送信されますが、フィルタリングはありません。

ありがとうございます。 :)

EDIT:

@subscription_statuses = User.subscription_statuses.keys 

これは、文字列の配列であり、データベース内の値を文字列として保存されます。

+0

あなたはPLS出力.to_sql' ...例えば 'でコールをsufixingことで、あなたのコードによって生成されたSQLクエリすることができます。 :User.where(id:[1,2,3])。to_sql' – equivalent8

+0

あなたの質問が正しいかどうか分かりませんが、これは私が生成したものです:User.where(:subscription_status => ["trialing "、" past_due "]))to_sql " SELECT 'users'。* FROM' users' WHERE 'users'.subscription_status' IN(0、0)"。あなたは正しいです、ここに問題がありますが、私はなぜそれがこのように変換するのか分かりません。クエリに「ステータス」の代わりに[1,2]を入れようとすると、値が文字列として保存されるため、何も表示されません。 –

答えて

0

いくつかのことが思い浮かぶ。私は前にこの種の問題を持っていたので、私は唯一のstatuesあなたがここに生成

= check_box_tag 'statuses[]', status 

が文字列であることを、ここで想定することができます。

params[:statuses]に渡すと、それは文字列の配列ですが、enum型でクエリを実行すると、単なるものであればsymやstringのどちらでも渡すことができます。しかし、あなたが複数ある場合はそうではありません。

where :subscription_status => statusesWHERE users.subscription_status IN (0, 0, 0)のようなSQLを生成しますが、すべてsubscription_statusesは整数であるenum型として格納されます。

だからあなたの場合には、あなたが最初にこの

where(subscription_status: User.subscription_status.slice(*statuses).values) 

のように、それに対応する整数値を見つける必要がある。また、あなたはよく

UPDATE

以来、このanswerは役に立ちかもしれませんデータベースに文字列としてsubscription_statusが既に格納されており、その列を列挙型としてに宣言していますモデルでは、潜在的に競合が発生し、その結果、目的のクエリが生成されませんでした。列挙型宣言を単純に削除すると、問題が解決される可能性があります。

UPDATE 2

は、だから私は、レールコンソールで列挙型で周り台無し。文字列の配列を渡すときに表示されるクエリの問題について、IN (0, 0, 0)シンボルの配列を渡すと、実際にはIN (NULL, NULL, NULL)と表示されます。

私が推測しているのは、enum型として宣言しているため、各ステータスが整数であることが必要なので、クエリを生成する前にwhere(subscription_status: statuses)を試したときにおそらくstatuses.map(&:to_i)でした。新しい発見(yay me!)"hello".to_i => 0の間に、:hello.to_i => undefined methodしたがって(0, 0, 0)(NULL, NULL, NULL)の間に。 (私はあなたがここに私の厄介な説明を理解してほしい)

Possibility of mapping enum values to string type instead of integer

+0

これは問題ではありません... subscription_statusはデータベースにstringとして保存されますデータベースはphp/MySQLで最初に作成されたものです。また、@subscription_statuses = User.subscription_statuses.keysという変数を表示するのを忘れました。これには文字列の配列が含まれています。 –

+0

しかし、 '@subscription_statusesにはENUMリストが含まれていると言われました。おそらくモデルで' subscription_status'をどのように定義するのかを見てみましょうか? – lusketeer

+0

モデル:enum subscription_status:[:active、:trialing、:past_due、:deleted、:cancelled] –

0

このコードをレールコンソールで試してみてください。あなたの実装には問題はないはずですが、生成されたSQLを見てみるのが理想的です。あなたはByebugのようなコンソールデバッガを使ってリクエストをデバッグし、それを実行するのに役立ちます。

関連する問題