【问题标题】:Filter for values OR IS NULL in activeadmin在 activeadmin 中过滤值 OR IS NULL
【发布时间】:2013-10-31 02:43:19
【问题描述】:

鉴于我有两个模型:

class Post < ActiveRecord::Base
  belongs_to :district
end

class District < ActiveRecord::Base
  has_many :posts
end

我需要在帖子页面上的 ActiveAdmin 中创建一个check_boxes 过滤器,以便用户能够获取属于某些确切地区或根本不属于任何地区的帖子。

在 ActiveAdmin 将 MetaSearch 更改为 Ransack 之前,这可以通过自定义范围来完成。现在我没有任何想法。当我执行以下操作时:

filter :district_id_null, as: :boolean
filter :district, as: :check_boxes

它产生条件WHERE district_id IN (1,2,3) AND district_id IS NULL(我需要 OR 而不是 AND)。当我这样做时

filter :district, as: :check_boxes, collection: proc { District.unscoped.map { |x| [x.title, x.id] }.unshift ['Empty', 'null'] }

它产生条件WHERE district_id IN (0,1,2,3)(但在大多数 SQL 数据库中,NULL 不是 0)。

【问题讨论】:

    标签: ruby-on-rails activeadmin ransack


    【解决方案1】:

    我认为这样的事情可能会奏效

    class Post
        def self.ransack_with_or(search_params)
            params = search_params.deep_clone
            #check if we need OR
            if search_params.has_key?('district_id_in') && search_params.has_key?('district_id_null')
             params.delete('district_id_null')
             district_id_in = params.delete('district_id_in')
             #old behaviour without district_id_null and district_id_null attributes
             q = ransack_without_or(params)
             #here we're adding OR group 
             q.build_grouping({m: 'or', district_id_null: true, district_id_in: district_id_in}) 
            else
             #old behaviour we don't need OR
             q = ransack_without_or(params)
            end
            q
           end
    
           #wrapping ransack method 
           class << self
             alias_method_chain :ransack, :or
           end
        end
    

    【讨论】:

      猜你喜欢
      • 2012-08-15
      • 2011-12-03
      • 2014-12-08
      • 2012-11-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-25
      相关资源
      最近更新 更多