Rails3.2でフィルターを構築するためにURLで複数のパラメーター入力を処理する方法に少し迷っています
基本的には、 http ://example.com/products/?category=24とhttp://example.com/products/?category=24&country=24を連携させたいと思います。
私は次のモデルを持っていProduct
ますCountry
、、、Category
Categorization
私は自分の中で簡単な条件を構築することができますProductController
def index
@products = product.all
if params[:country]
@products = Country.find(params[:country]).products
end
if params[:category]
@products = Category.find(params[:category]).products
end
end
私Category
とモデルがhas_manyアソシエーションを使用してモデルをProduct
介してモデル化するので、これに取り組むための最良の方法を知りたいと思いました。Categorization
class Product < ActiveRecord::Base
has_many :categorization
belongs_to :country
end
class Category < ActiveRecord::Base
has_many :categorization
has_many :products, through: :categorization
attr_accessible :name
end
class Categorization < ActiveRecord::Base
belongs_to :category
belongs_to :product
attr_accessible :category, :product
end
私のビューレイアウトテンプレートは、カテゴリと国のリンクの単純なリストです。したがって、誰かが「おもちゃ」というカテゴリをクリックし、国「イングランド」をクリックすると、次のようなリンクが作成されます。http: //www.example.com/products/category=12&country_id=1
<div class="wrapper">
<div class="products">
</div>
<div class="sidebar>
<h2>Categories</h2>
<ul>
<% @categories.each do |category| %>
<li><%= link_to category.name, params.merge(category: category.id) %></li>
<% end %>
</ul>
<h2>Countries</h2>
<ul>
<% @countries.each do |country| %>
<li><%= link_to country.name, params.merge(country: country.id) %></li>
<% end %>
</ul>
</div>
</div>
更新しました
モデルクラスにフィルターを作成するという提案をしましたが、以下のコードは機能しますが、かなり厄介で、DRYではないようです。誰かが別のアプローチを支援できますか。
# Product Model
class Product < ActiveRecord::Base
# Search filter
def self.filter_by_params(params)
if params.has_key?(:category) && params.has_key?(:country_id)
scoped.joins(:categorization).where("category_id = ? AND country_id = ?", params[:category], params[:country_id])
elsif params.has_key?(:category)
scoped.joins(:categorization).where("category_id = ?", params[:category])
elsif params.has_key?(:country_id)
scoped.where(country_id: params[:country_id])
else
scoped
end
end
end
# Product Controller
def index
@product = Product.filter_by_params(params)
end
アドバイスをありがとうございます。
WD