ruby-on-rails – Ransack:如何使用现有的范围?

前端之家收集整理的这篇文章主要介绍了ruby-on-rails – Ransack:如何使用现有的范围?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
将Rails 2应用程序转换为Rails 3,我必须更换gem searchlogic.现在,使用Rails 3.2.8与gem Ransack我想构建一个使用现有范围的搜索表单.例:
class Post < ActiveRecord::Base
  scope :year,lambda { |year| 
    where("posts.date BETWEEN '#{year}-01-01' AND '#{year}-12-31'") 
  }
end

据我所知,这可以通过定义一个自定义ransacker来实现.可惜的是,我没有找到关于这个的任何文档.我在Postclass中尝试过:

ransacker :year,:formatter => proc {|v| 
            year(v)
          }

但这不行:

Post.ransack(:year_eq => 2012).result.to_sql
=> TypeError: Cannot visit ActiveRecord::Relation

我尝试了一些变种的赎金申报单,但都没有工作.我需要一些帮助…

更新:上面的范围就是例子.我正在寻找一种方法来使用Ransack中的每一个现有的范围.在Ransack的前身MetaSearch中,有一个名为search_methods的功能用于使用范围. Ransack还有no support for this开箱即用.

解决方法

劫匪合并 https://github.com/activerecord-hackery/ransack/pull/390支持开箱即用.您应该声明ransakable_scopes方法添加可见的亵渎范围.

从手册

继续前面的部分,搜索范围需要在模型类上定义一个ransackable_scopes的白名单.白名单应该是一个符号数组.默认情况下,所有类方法(例如范围)都将被忽略.将应用范围来匹配真实值,如果范围接受值,则应用范围:

class Employee < ActiveRecord::Base
  scope :activated,->(boolean = true) { where(active: boolean) }
  scope :salary_gt,->(amount) { where('salary > ?',amount) }

  # Scopes are just syntactical sugar for class methods,which may also be used:

  def self.hired_since(date)
    where('start_date >= ?',date)
  end

  private

  def self.ransackable_scopes(auth_object = nil)
    if auth_object.try(:admin?)
      # allow admin users access to all three methods
      %i(activated hired_since salary_gt)
    else
      # allow other users to search on `activated` and `hired_since` only
      %i(activated hired_since)
    end
  end
end

Employee.ransack({ activated: true,hired_since: '2013-01-01' })

Employee.ransack({ salary_gt: 100_000 },{ auth_object: current_user })

猜你在找的Ruby相关文章