Rails:基于多个参数过滤?

我有一个简单的应用程序,用户可以按类别,纪律和目标组基于三个不同的参数进行过滤。 所有参数都是可选的。 到目前为止它的工作原理,但下面的控制器有点臃肿,我也认为这三个if语句有点乱。

有更清洁的方法吗?

def index @listings = Listing.includes(:categorizations, :listing_disciplines, :listing_targets).page(params[:page]) if params[:category_id].present? && params[:category_id] != "" @category_id = Category.find_by(id: params[:category_id]) @listings = @category_id.listings end if params[:discipline_id].present? && params[:discipline_id] != "" @discipline_id = Discipline.find_by(id: params[:discipline_id]) @listings = @discipline_id.listings end if params[:target_id].present? && params[:target_id] != "" @target_id = Target.find_by(id: params[:target_id]) @listings = @target_id.listings end if params.blank? @listings end 

这是我的上市模型:

 class Listing  "200x200#" } validates_attachment_content_type :image, content_type: /\Aimage\/.*\Z/ validates :title, presence: true, uniqueness: true paginates_per 15 end 

我不相信你的代码甚至可以工作,因为你正在用每个param重置列表。 我假设您希望能够一次过滤所有三个。 一种更清洁的方式是:

 def index @listings = Listing.joins(:categorizations, :listing_disciplines, :listing_targets) @listings = @listings.where("categorizations.category_id = ?", params[:category_id]) if params[:category_id].present? && params[:category_id] != "" @listings = @listings.where("listings_disciplines.discipline_id = ?", params[:discipline_id]) if params[:discipline_id].present? && params[:discipline_id] != "" @listings = @listings.where("listing_targets.target_id = ?", params[:target_id]) if params[:target_id].present? && params[:target_id] != "" @listings = @listings.page(params[:page]) end 

这将使所有filter累积。