【问题标题】:Dynamic ActiveRecord finder methods chaining based on params基于参数的动态 ActiveRecord 查找器方法链接
【发布时间】:2012-08-05 21:22:38
【问题描述】:

我是 Rails 新手,我想根据不同的 GET 参数(过滤和排序)进行选择查询。我可以添加一些条件以在代码中查找吗?

例如:

if params[:ratings] 
  Movie.where(:rating => params[:ratings].keys)
end

然后添加 ordering 和其他 where 条件。我怎样才能做到这一点?也许有更好的方法来动态修改选择查询(不制作 SQL 字符串)。 谢谢。

【问题讨论】:

    标签: ruby-on-rails ruby activerecord rails-activerecord


    【解决方案1】:

    where, order, ... 方法返回 ActiveRecord::Relation 对象,因此您可以继续调用更多查询方法:

    query = Movie
    if(params[:ratings])
      query = query.where(:rating => params[:ratings].keys)
    end
    if(params[:some_order_param])
      query = query.order(params[:some_order_param])
    end
    # Keep adding more 'where', 'order', 'group', ... methods as needed ...
    results = query.all
    

    【讨论】:

    • 啊,天才。我一直在努力解决如何“开始”默认查询,错误地调用Movie.all——这很简单!为了保持整洁,甚至可以使用query = query.order(params[:some_order_param]) if params[:some_order_param] 将每个潜在的过滤器放在一行中。 Rails 是一种美丽且令人愉悦的东西!
    【解决方案2】:

    对于这种类型的行为,我实际上推荐has_scope gem。它允许您在模型上定义范围和类方法,并自动将它们用于控制器中的过滤、排序等。

    这是文档中的一个小示例,但您可以使用它做很多事情:

    class Graduation < ActiveRecord::Base
      scope :featured, where(:featured => true)
    end
    
    class GraduationsController < ApplicationController
      has_scope :featured, :type => :boolean
    end
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多