2

Rails3.2でフィルターを構築するためにURLで複数のパラメーター入力を処理する方法に少し迷っています

基本的には、 http ://example.com/products/?category=24とhttp://example.com/products/?category=24&country=24を連携させたいと思います。

私は次のモデルを持っていProductますCountry、、、CategoryCategorization

私は自分の中で簡単な条件を構築することができます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

4

1 に答える 1

7

ProductsController次のように変更します。

def index
  @products = Product.filter_by_params(params)
end

次に、Productモデルで:

def self.filter_by_params(params)
  scoped = self.scoped
  scoped = scoped.where(:country_id => params[:country_id]) if params[:country_id]          
  scoped = scoped.where(:category_id => params[:category_id]) if params[:category_id]
  scoped
end

category_id と country_id を渡すようにビューを変更する必要があります。

于 2012-09-30T16:07:48.697 に答える