在Rails中统一两个对current_user的查询

时间:2014-08-27 21:43:39

标签: ruby-on-rails

我有以下关联:

User has_many HostsHost has_many Orders

我有主机和订单的嵌套路由,因此当用户想要查看订单时,它必须通过主机(/hosts/:id/orders

我想避免用户访问其他用户的订单,所以我在索引操作中有这个:

def index
  host = current_user.hosts.find(params[:host_id])
  redirect_to :back, alert: 'Host was not found' if host.nil?
  orders = host.orders.includes(:order_state).order('id ASC')
end

如你所见,我两次击中数据库。一个用于查找主机是否存在current_user,另一个用于查找此主机的订单。

如何只在一个查询中执行此操作?

2 个答案:

答案 0 :(得分:1)

尝试这样的事情:

orders = Order.joins(:host)
              .includes(:order_state)
              .where(hosts: { user_id: current_user.id, id: params[:host_id] })
              .order('orders.id ASC')
redirect_to :back, alert: 'Orders for selected host not found' unless orders.any?

如果您想为未找到的主机提供用户警报,则无法通过一个查询执行此操作。

答案 1 :(得分:0)

正如sufleR已经提到的,如何区分no orders for the given hosthost not found可能不是一个简单的方法。但是,代码可以更简单:

class User < ActiveRecord::Base
  has_many :hosts
  has_many :orders, through: :hosts # !!!
end

orders = current_user.orders.includes(:order_state).order(:id).
  where(host_id: params[:host_id])