我有一个简单的应用程序,用户可以按类别,纪律和目标组基于三个不同的参数进行过滤。所有参数都是可选的。到目前为止它的工作原理,但下面的控制器有点臃肿,我也认为这三个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 < ActiveRecord::Base
has_many :categorizations, dependent: :destroy
has_many :categories, through: :categorizations
has_many :listing_disciplines, dependent: :destroy
has_many :disciplines, through: :listing_disciplines
has_many :listing_targets, dependent: :destroy
has_many :targets, through: :listing_targets
has_attached_file :image, styles: { :medium => "200x200#" }
validates_attachment_content_type :image, content_type: /\Aimage\/.*\Z/
validates :title, presence: true, uniqueness: true
paginates_per 15
end
答案 0 :(得分:0)
我不确定您的代码是否有效,因为您正在使用每个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
这将使所有过滤器累积。