我有以下关联:
User has_many Hosts
和Host 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,另一个用于查找此主机的订单。
如何只在一个查询中执行此操作?
答案 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 host
和host 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])