2016-05-13 10 views
1

私は多くの多型の関係に多く持っている:抽出関連モデル

/contacts/1/tasks?status_id_is=1&user_id_is=1 

しかし、時には:

class DocumentTask < ActiveRecord::Base 
    belongs_to :task 
    belongs_to :document, polymorphic: true 
end 

class Task < ActiveRecord::Base 
    has_many :documents, through: :document_tasks 
end 

class Contact < ActiveRecord::Base 
    has_many :tasks, though: :document_tasks, as: :document  
end 

class Service < ActiveRecord::Base 
    has_many :tasks, through: :document_tasks, as: :document 
end 

を私は、サーバーに情報を送信し、このように見えるURLを持っていますこれは多様な関係があるため、次のように見えます。

/services/1/tasks?status_id_is=1&user_id_is=1 

私のコントロールr、その多型関係の対象を取得する必要があります。一般的に、私は、次の操作を行うことができます。URLがクエリ文字列が含まれている場合status_id_isとuser_id_isが正規表現にマッチするので、

document_id = params.detect {|name,_| name =~ /(.+)_id/} 
@document = document_id[0].gsub("_id","").capitalize.constantize.find(document_id[1]) 

しかし、これは動作しません。明白な解決策は、正規表現を/^(.+)_id$/に変更することですが、その他のユースケースがいくつ発生する可能性があるかは誰にも分かります。

私が欲しいものを達成する良い方法はありますか?たとえば、request.association_parameterまたはparams.association_parameterのようなリクエストオブジェクト内の何か。

+0

'status_id_is'と' user_id_is'とは何ですか?それらは 'document'オブジェクトの' status_id'属性と 'user_id'属性を参照していますか?同様に、Task、Contact、Serviceのすべてのモデルに 'status_id'属性と' user_id'属性があるかどうかを尋ねています。 –

+0

status_id_isとuser_id_isは、タスクに関連するフィルタパラメータです。彼らはドキュメントとは関係ありません。モデルのどれもがstatus_idまたはuser_id属性を持っていません。同時に、私は容易に壊れない柔軟なソリューションを望んでいます。安い解決策は、/^(.+)_id$/のような正規表現を使うことですが、誰が知っていれば、後で道路を壊す可能性があります。 – Donato

+0

{}ブロックで2つの引数とともに '.detect'が使われているのを見たことがありません。それは何をするためのものか?ちょうど私はコードが何をしようとしているのか理解できました。 –

答えて

0

検索やフィルタリングのようなコレクションのフィルタリングでは、フィルタリングの代わりにparams[:q]を使用する代わりの方法を提案できます。

これはransack(GEM)とElasticSearchは、スコーピングのラッパーparamですqまたはqueryのparamsを、どのように使用するかのようなAPIのフィルタリングのための「一部」の規則に沿ったものです。 [:Q] status_id_isuser_id_isは内部のparamsになりますので、

等価的には、このアプローチを以下の場合、あなたはこのように

以下
/contacts/1/tasks?q[status_id_is]=1&q[user_id_is]=1 

のようになります、あなたは今、あなたのparams.detectにループ何の問題もありませんしたがって、ハーフでは1レベル深くなり、ループはすでに考慮されていません。したがって、任意のMODEL_idパラメタは、多形経路のために働くでしょう。

+0

これは良い考えのようです。 – Donato

+0

「APIフィルタリングの規則」について述べました。これらの規則はどこに文書化されていますか?そのような使用:q? – Donato

+0

あなたは正しいです、技術的に言えば、私は "q"や "query"のようなparamラッパーを使用する "彼らの"コンベンションであるべきです。私はまだそれを調べていませんが、ラッパーのパラメータを使用しているのが本当にフィルタリングのコンベンションです。誰かが知っているか見つけたら、好奇心を満たすために私に知らせてください。 –