ruby-on-rails – Arel AND子句和Empty条件

前端之家收集整理的这篇文章主要介绍了ruby-on-rails – Arel AND子句和Empty条件前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
请考虑以下代码片段:
  1. def sql
  2. billing_requests
  3. .project(billing_requests[Arel.star])
  4. .where(
  5. filter_by_day
  6. .and(filter_by_merchant)
  7. .and(filter_by_operator_name)
  8. )
  9. .to_sql
  10. end
  11.  
  12. def filter_by_day
  13. billing_requests[:created_at].gteq(@start_date).and(
  14. billing_requests[:created_at].lteq(@end_date)
  15. )
  16. end
  17.  
  18. def filter_by_operator_name
  19. unless @operator_name.blank?
  20. return billing_requests[:operator_name].eq(@operator_name)
  21. end
  22. end
  23.  
  24. def filter_by_merchant
  25. unless @merchant_id.blank?
  26. return billing_requests[:merchant_id].eq(@merchant_id)
  27. end
  28. end
  29.  
  30. private
  31.  
  32. def billing_requests
  33. @table ||= Arel::Table.new(:billing_requests)
  34. end

方法filter_by_merchant中,当商家ID变为空时,Arel必须返回的值应该忽略AND子句效果
还有,有更好的方法来处理这种情况吗?

解决方法

你应该返回true.当你运行.and(true)时,它最终会在sql中转换为’AND 1′.
  1. def filter_by_merchant
  2. return true if @merchant_id.blank?
  3.  
  4. billing_requests[:merchant_id].eq(@merchant_id)
  5. end

猜你在找的Ruby相关文章