0

我们需要在我们的 rails 应用程序中检索logsfor 。customer comm record简单英语的条件是 customer_comm_record 的日志,基于:

#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. 

#1 的 SQL 代码可以是 ( SQL#1):

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

#2 的 SQL 代码可以是 ( 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是(将 session[: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。有人可以回答这个问题吗?如果不是,什么是正确的?谢谢。

4

1 回答 1

2

唯一的区别是:

  • 第一种方法将返回重复的条目,其中客户和项目的 sales_id 都与用户 ID 匹配。
  • 第二种方法可能不会返回具有匹配 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 并返回客户,无论他们是否与项目相关联。

于 2013-04-25T19:35:07.703 回答