2011-08-13 8 views
1

私はテーブルハウス、会社、通り、ハウスタイプと関連モデルがあります。モデルとビューのフィルタ

各ハウスは、当社、HouseTypeとストリートに属し

はまた、私はすでにハウスモデルで正しいスコープのメソッドを持っています:

scopes: belong_to_company, on_street, with_type 

これは、ビューにフィルタを作成する必要があります。しかし、ユーザーがフィルタで複数​​のオプションを選択できる可能性があります。彼はいくつかの通りをマークすることができ、またいくつかのHouseTypesといくつかの会社をマークすることができます。

だから私は、家のモデルで、このようなメソッドを追加します。

def self.filter_for_types(company, street, types) 
    houses = [] 
    each.types do |type| 
     houses = houses + House.belong_to_company(company).on_street(street).with_type(type) 
    end 
    houses.uniq 
end 

def self.filter_for_streets(company, streets, types) 
    houses = [] 

    each.streets do |street| 
     houses = houses + House.filter_for_types(company, street, types) 
    end 
    houses.uniq 
end 

def self.filter(companies, streets, types) 
    houses = [] 

    each.companies do |company| 
     houses = houses + House.filter_for_streets(company, streets, types) 
    end 
    houses.uniq 
end 

だから、ビューで、私はそれにいくつかあります

def index 
    House.filter(params[:companies], params[:streets], params[:types]) 
end 

を、私は私のコードは非常によくないと思われます。 私はモデルで何ができますか?(スコープにすべてのコードを入れてください - 良い考えですか?)

このようなビュー生成にはかなりのプラグインがありますか?

答えて

1

これは完全に受け入れられています。実際にあなたがRailsでやっていること、スキニーコントローラと太ったモデルを維持することです。モデルにコードがたくさんあると思うようになったら、これらのメソッドをモジュールに細分することもできます。 User :: CompanyFilters、会社に関連するすべてのフィルタを配置し、コードをモジュール化しておく場所ですが、これは必須条件ではありません。

また、代わりにあなたの結果にuniqのを行うので、あなたのSQL文に BY DISTINCTまたはGROUPを使用しようとします、あなたはから(ワイヤ上不要な情報を送信していないことを確認してください。この方法あなたのデータベース)を作成し、不必要なActiveRecordオブジェクトを作成しないでください。

関連する問題