boy*_*tog 8 ruby ruby-on-rails rails-activerecord
我正在尝试扩展我的服务器端数据表的功能.我将一些额外的过滤器传递给我的控制器/数据表,我用它来过滤结果.目前在我的模型中,我正在测试在应用我的示波器之前是否存在参数,但我不相信这是最好的方法,因为当我的过滤器列表增长时,我会有很多if/else场景.我怎么能这样做'轨道'?
if params[:store_id].present? && params[:status].present?
Order.store(params[:store_id]).status(params[:status])
elsif params[:store_id].present? && !params[:status].present?
Order.store(params[:store_id])
elsif !params[:store_id].present? && params[:status].present?
Order.status(params[:status])
else
Order.joins(:store).all
end
Run Code Online (Sandbox Code Playgroud)
答案:将答案结合到这个工作代码中:
query = Order.all
query = query.store(params[:store_id]) if params[:store_id].present?
query = query.status(params[:status]) if params[:status].present?
query.includes(:store)
Run Code Online (Sandbox Code Playgroud)
Ho *_*Man 13
你可以这样做:
query = Order
query = query.store(params[:store_id]) if params[:store_id].present?
query = query.status(params[:status]) if params[:status].present?
query = Order.joins(:store) if query == Order
Run Code Online (Sandbox Code Playgroud)
或者,您也可以重新构建status和store范围以包含内部条件:
scope :by_status, -> status { where(status: status) if status.present? }
Run Code Online (Sandbox Code Playgroud)
然后你可以这样做:
query = Order.store(params[:store_id]).by_status(params[:status])
query = Order.joins(:store) unless (params.keys & [:status, :store_id]).present?
Run Code Online (Sandbox Code Playgroud)
Rob*_*bel 12
由于关系是可链接的,因此"构建"搜索查询通常很有帮助.这样做的确切模式差异很大,我提醒不要过度设计任何东西,但是在我工作的大多数大型Rails代码库中,使用普通的Ruby对象(PORO)来构建查询是很常见的.在你的情况下,你可能只是简单地简化你的逻辑:
relation = Order.join(:store)
if params[:store_id]
relation = relation.store(params[:store_id])
end
if params[:status]
relation = relation.status(params[:status])
end
@orders = relation.all
Run Code Online (Sandbox Code Playgroud)
Rails甚至提供了"撤消"以前链接过的逻辑的方法,以防您的需求变得特别复杂.
| 归档时间: |
|
| 查看次数: |
3961 次 |
| 最近记录: |