gpt4 book ai didi

ruby-on-rails - 在 Controller 中干净地处理多个过滤器(参数)

转载 作者:数据小太阳 更新时间:2023-10-29 07:12:47 30 4
gpt4 key购买 nike

我有一个名为 Post 的类,我需要能够适应以下场景:

  • 如果用户选择了一个类别,则只显示该类别的帖子
  • 如果用户选择了一种类型,则只显示该类型的帖子
  • 如果用户选择了一个类别和类型,则只显示该类别中该类型的帖子
  • 如果用户没有选择任何内容,则显示所有帖子

我想知道我的 Controller 是否不可避免地会因大量条件语句而显得粗糙...这是我解决此问题的错误方法 - 有谁知道我如何才能做到这一点?

class PostsController < ApplicationController

def index
@user = current_user

# If a user has not specified a type or category,
# show them everything
@posts = Post.all

# If a user has selected a category, but no type, only
# show posts from that category.
if params[:category] && !params[:type]
category = Category.find(params[:category])
@posts = @category.posts
end

# If a user has selected a category and a type, only show
# posts from that category with that type
if params[:category] && params[:type]
category = Category.find(params[:category])
type = params[:type]
@posts = category.posts.where(post_type: type)
end

# If a user has selected a type but not a category, show all
# of the posts with that type
if params[:type] && !params[:category]
type = params[:type]
@posts = Post.where(post_type: post_type)
end
end

end

最佳答案

您最好遵循“胖模型,瘦 Controller ”的惯例,这意味着您应该将这种逻辑放在模型本身中。 Post 类应该能够报告哪些帖子符合您的条件,因此您可以定义一个方法来执行此操作:

class Post < ActiveRecord::Base
...
def self.by_category_and_type(category = nil, type = nil)
return where(category: category, type: type) if category && type
return where(category: category) if category
return where(type: type) if type
all
end
...
end

然后在你的 Controller 中你可以调用

@posts = Post.by_category_and_type(params[:category], params[:type])

我还没有对此进行测试,但我认为它应该可以解决问题。如果没有,请告诉我!

关于ruby-on-rails - 在 Controller 中干净地处理多个过滤器(参数),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21590671/

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