2013-04-25 2 views
0

Нам нужно получить logs для customer comm record в наших рельсах. Условие в простом английском языке является журналы для customer_comm_record на основе:Эти два вопроса одинаковы в рельсах 3.2.12?

#1. the sales_id in customer comm record's customers is equal to current user id 
#2. the sales_id in customer comm record's customer's project is equal to the current user id. 

SQL код # 1 может быть (SQL#1):

Log.joins(:customer_comm_record =>:customer).where('customers.sales_id = ?', session[:user_id]) 

SQL код # 2 может быть (SQL#2):

Log.joins(:customer_comm_record =>{ :customer => :projects}).where('projects.sales_id = ?', session[:user_id]) 

Вот что мы придумали (SQL#3) в одной строке:

Log.joins(:customer_comm_record =>{ :customer => :projects}).where('customers.sales_id = ? OR projects.sales_id = ?', session[:user_id], session[:user_id]) 

код SQL, возвращенный выше в rails console есть (замена сессии [: user_id] с 1):

SELECT "logs".* FROM "logs" INNER JOIN "customer_comm_records" ON "customer_comm_records"."id" = "logs"."customer_comm_record_id" INNER JOIN "customers" ON "customers"."id" = "customer_comm_records"."customer_id" INNER JOIN "projects" ON "projects"."customer_id" = "customers"."id" WHERE (customers.sales_id = 1 OR projects.sales_id = 1) 

Вопрос заключается в том погоды SQL#3 == SQL#1 UNION SQL#2. Может кто-то ответить на вопрос? Если это не так, то какая? Благодарю.

ответ

2

Единственные отличия:

  • Первый метод возвращает повторяющиеся записи, где sales_id для клиента и проекта и соответствовать пользователи идентификатор.
  • Второй способ может не возвращать записи, где у клиента с подходящим продавцом нет проекта (для этого клиента нет projects.customer_id).

Последнее различие имеет значение только в том случае, если у клиента нет проектов. В противном случае второй метод лучше, потому что он позволяет избежать дублирования.

Если клиент не всегда есть проект, простое решение было бы использовать includes вместо joins:

Log.includes(:customer_comm_record =>{ :customer => :projects}). 
    where('customers.sales_id = :id OR projects.sales_id = :id', id: session[:user_id]) 

Это заставит LEFT JOIN и вернет клиентам независимо от того, являются ли они связаны с проект.

+0

Извините, на что первый метод и второй метод? – user938363

+0

Первый метод = SQL # 1 UNION SQL # 2. Второй метод = SQL # 3. – PinnyM

+0

ОК. Разница имеет смысл. Может быть, случай, когда у клиента нет проекта, но может иметь журналы (вероятно, очень редко). Поскольку в rails нет объединения, существует ли способ выполнить SQL # 1 UNION SQL # 2 в рельсах? – user938363

Смежные вопросы