Rails gem Ransack -> 使用“is null”和特定值搜索“或条件”(field=x OR field IS NULL)

2024-01-12

我为我们的支持者制作了一个支持票系统 - 使用 ruby​​ on Rails 进行编程(Ruby 1.9.3 Rails 3.2)

有一个票证模型belongs_to与用户(支持者)的关联。

我使用 Ernie 的 gem Ransack 进行搜索。 当支持者搜索自己的票证(由 Tickets_controller.index 处理)时,他还应该在搜索结果(视图/票证/索引)中看到不关联的票证(与其他搜索条件相结合,例如“日期”或其他内容)

(这样他就可以拿一张不限票)

预期的 SQL 语句:

SELECT * FROM tickets WHERE ... AND (user_id=5 OR user_id IS NULL) AND ... 

I tried user_id_null_or_user_id_eq在索引视图的搜索形式中 - 但这不起作用(没有方法错误)

我如何制作自定义谓词(或掠夺者)来解决这个问题? (感谢@Magnuss 的评论)

不幸的是,我没有和阿雷尔打交道的经验

就像是:

ransacker :user_null_or_eq do
    ...
end

在门票模型中。

我希望这能更详细地解释这个问题。

谢谢你的帮助。


我也必须弄清楚这一点,@TomG 的回答很有帮助! 您确实不需要为这个问题创建一个 ransacker,它可以通过使用 ransack 的 build_grouping 方法(没有在任何地方记录...)来修复,并使用“或”条件放入您需要的条件。

我用它来搜索要添加到笼子中的项目,但想仅向用户显示尚未在我的笼子中的项目(也未分配给任何其他笼子),因此在我的控制器中:

   @search = Cage.ransack(params[:q])
   @search.build_grouping({:m => 'or', :storage_id_not_eq => @cage_item.id, :storage_id_null => true})  
   @results_count = @search.result(:distinct => true).length
   @items = @search.result(:distinct => true).paginate(:per_page => 20, :page => params[:page] || 1)

   @search.build_condition if @search.conditions.empty?
   @search.build_sort if @search.sorts.empty?

因此,当我打印查询 ransack is running 时,它将显示:

 @search.result.to_sql
"SELECT `specimens`.* FROM `specimens`  WHERE (`specimens`.`deleted_at` IS NULL) AND ((`specimens`.`storage_id` != 183 OR `specimens`.`storage_id` IS NULL))"

如果我添加名称查询:

@search.result.to_sql
"SELECT `specimens`.* FROM `specimens`  WHERE (`specimens`.`deleted_at` IS NULL) AND ((`specimens`.`name` LIKE '%root%' AND (`specimens`.`storage_id` != 183 OR `specimens`.`storage_id` IS NULL)))"

希望这可以帮助您或其他在搜查条件下使用 OR 而不是基本 AND 时遇到困难的人。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Rails gem Ransack -> 使用“is null”和特定值搜索“或条件”(field=x OR field IS NULL) 的相关文章

随机推荐