我对如何处理 URL 中的多个参数输入以在 Rails 3.2 中构建过滤器有点迷茫
基本上,我想把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
和Product
模型通过Categorization
模型通过 has_many 关联。
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
我的视图布局模板是一个简单的类别和国家链接列表。因此,如果有人点击一个名为“Toys”的类别并点击国家“England”,它应该建立一个如下链接: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
非常感谢您的任何建议。
西部数据