2014-08-27 56 views
2

我有以下的關聯:統一兩個查詢爲CURRENT_USER 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 

正如你所看到的,我打了兩次DB。一個用於查找主機是否存在current_user,另一個用於查找該主機的訂單。

如何在一個查詢中執行此操作?

回答

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? 

如果你想給不發現你不能與一個查詢做主機用戶警報。

+0

如果'''''''redirect_to'沒有使用'unless'的語法嗎? – tolgap 2014-08-28 09:54:33

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])