微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

ruby-on-rails – Rails gem Ransack – >搜索’或condition’,’is null’和一个特定值(field = x OR field IS NULL)

我为我们的支持者制作了一个支持票系统 – 用 ruby编写轨道( Ruby 1.9.3 Rails 3.2)

存在与用户(支持者)具有belongs_to关联的票证模型.

我使用Ernie的gem Ransack进行搜索.
支持搜索他自己的票据(由ticket_controller.index处理)时,他还应该在搜索结果中看到无关联票证(views / tickets / index)(结合其他搜索条件,例如“date”或其他)

(这样他可以拿开票)

预期的sql语句:

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

我在索引视图的搜索表单中尝试了user_id_null_or_user_id_eq – 但这不起作用(没有方法错误)

如何创建自定义谓词(或ransacker)来解决此问题? (感谢@Magnuss的评论)

不幸的是,我没有Arel的经验

就像是:

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正在运行时,它将显示

@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)))"

希望这可以帮助您或其他人在搜索条件而不是基本AND中使用OR时遇到问题.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐