gpt4 book ai didi

ruby-on-rails - 在 Rails 中重构一个复杂的过滤器

转载 作者:行者123 更新时间:2023-12-04 05:44:35 25 4
gpt4 key购买 nike

我正在尝试处理一个有些复杂的查询。我已经阅读了一些关于如何处理这个问题的方法,但它们在这里并不真正适用,因为这不像一个复杂的搜索表单(比如在 vBulletin 搜索帖子表单上),而是一组过滤两者的路由按“类别”(未发布、流行、最新)和“时间”(所有时间、上个月、上周、今天)

我意识到下面的代码非常糟糕。我的目标只是让它工作,然后重构。更不用说,它甚至没有真正起作用,因为它没有考虑到类别和时间,只是一个或另一个,但我想我会在这个线程中处理这个问题。

另外,为了让这个 SO 代码粘贴更清晰,我从每一行中排除了 .page(params[:page]).per(30),但是它需要继续所有这些。

那么,有谁知道我该怎么做呢?我已经考虑了一段时间,有点难过

def index
case params[:category]
when "latest"
@books = Book.all.page(params[:page]).per(30)
when "downloads"
@books = Book.order('downloads DESC')
when "top100"
@books = Book.order('downloads DESC').limit(100)
when "unreleased"
@books = Book.unreleased
else
@books = Book.all.page(params[:page]).per(30)
end

case params[:time]
when "today"
@books = Book.days_old(1)
when "week"
@books = Book.days_old(7)
when "month"
@books = Book.days_old(30)
when "all-time"
@books = Book.all
else
@books = Book.all.page(params[:page]).per(30)
end
end

路线:

# Books
get 'book/:id', to: 'books#show', as: 'book'

resources :books, only: [:index] do
get ':category/:time(/:page)', action: 'index', on: :collection
end

最佳答案

  1. 将所有查询作为作用域移至模型

    class Book < ActiveRecord::Base
    scope :downloads, -> { order('downloads DESC') }
    scope :top100, -> { order('downloads DESC').limit(100) }
    scope :unreleased, -> { unreleased }
    scope :today, -> { days_old(1) }
    scope :week, -> { days_old(7) }
    scope :month, -> { days_old(30) }
    scope :latest, -> { }
    scope :all_time, -> { }
    end
  2. 创建辅助方法来过滤参数,避免数据不匹配

    class BooksController < ApplicationController
    private

    def category_params
    %w(downloads top100 unreleased).include?(params[:category]) ? params[:category].to_sym : nil
    end

    def time_params
    %w(today week month latest all_time).include?(params[:time]) ? params[:time].to_sym : nil
    end
    end
  3. 通过应用与参数同名的范围来摆脱 case 语句

    def index
    query = Book.all
    query = query.send(category_params) if category_params
    query = query.send(time_params) if time_params
    @books = query.page(params[:page]).per(30)
    end

在四行时,我们仍在 Sandi Metz' guidelines 的边界内。 ! :)

关于ruby-on-rails - 在 Rails 中重构一个复杂的过滤器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19074190/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com