【问题标题】:How do I use a named_scope to filter records in my model如何使用 named_scope 过滤模型中的记录
【发布时间】:2010-06-17 09:09:31
【问题描述】:

我有一个带有“描述”字段的模型“产品”。现在我想在索引页面中有一个链接,单击该链接将显示描述为空白(空)的所有产品。

在模型中我定义了一个这样的named_scope

named_scope :no_description,      :conditions => { :description => "" }

我已通过在控制台上调用 Product.no_description.count 来检查 named_scope 是否有效。

据我所知,控制器应该处理来自“索引”操作链接的过滤请求,但能够将其与查看所有产品的默认设置区分开来。

 def index
    @products = Product.all
    ...

我的问题是让控制器处理不同的请求,为视图上的链接设置什么路由以及视图上的实际链接。希望我能解释我的问题。

【问题讨论】:

    标签: ruby-on-rails named-scope


    【解决方案1】:

    如果您的链接传入一个参数,您可以检查它并在索引操作中使用命名范围:

    def index
        if params[:no_description]
            @products = Product.no_description
        else
            @products = Product.all
        end
    end
    

    在您看来,您可以使用以下内容:

    link_to('No description', products_path(:no_description => 1))
    

    【讨论】:

    • 我认为你有一个错字,应该是Product.all 等(单数)。此外,link_to 末尾缺少一个括号。
    • @John 我已经修正了这些错别字。谢谢。
    【解决方案2】:

    您可以采用两种基本方法。您可以设置一个新的路由和控制器操作来显示无描述产品,或者您可以在超链接上使用查询字符串参数来进行区分。我会采用第二种方法,以避免过多的操作使控制器混乱。

    假设您使用的是RESTful routing,您的链接将如下所示:

    <%= link_to 'Products Without Descriptions', products_path(:filter => true) %>
    

    这是控制器动作,它简单地寻找参数的存在(即它不关心它有什么值):

    def index
      if params[:filter]
        @products = Product.no_description
      else
        @products = Product.all
      end
      ...
    end
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-07-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-03
      • 1970-01-01
      相关资源
      最近更新 更多