2010-08-03 77 views
0

我試圖找到哪些訂單結果由他們的房子名稱,然後由客戶的姓氏。複雜的導軌發現訂購

​​

我的問題是這將返回每個客戶的歷史。

如果我添加AND歷史記錄.finish_date IS NULL 這將阻止所選客戶的每個歷史記錄都被返回,但它也將阻止沒有歷史記錄或已設置完成日期的交集中的客戶被返回。

基本上我需要每個在路口返回一次的客戶都有當前的房子名稱(如果他們有一個),然後按他們的房子名稱和他們的姓氏排序。

那麼有沒有辦法做到這一點?

下面是一個例子

顧客

id last_name 
1  franks 
2  doors 
3  greens 

歷史

id finish_date  house_id  customer_id 
1  NULL    1    1 
2  NULL    2    2 
3  11/03/10   2    1 
4  22/04/09   1    2 

NULL =當前房子

間房屋

id name 
1 a 
2 b 

結果

路口= 1,2,3

last_name  house  
franks   a 
doors    b 
greens   NULL 

由於

回答

0

我想你需要使用外連接。

例如,這應該工作:

Customer.find(:all, 
    :conditions =>['customers.id IN (?) and histories.finish_date is null', intersection], 
    :joins => 'LEFT OUTER JOIN histories ON histories.customer_id = customers.id 
    LEFT OUTER JOIN houses ON histories.house_id = houses.id', 
    :order => "houses.name ASC, customers.last_name ASC", 
    :select => "customers.*, histories.job_title, houses.name" 
) 

如果你有客戶和歷史歷史和衆議院之間的關聯,你應該能夠做到:include => [:histories => :house],而不是:joins選項。

唯一的另一件事是,沒有房子的顧客將首先出現在列表中,這是因爲NULL的順序早於非NULL值。你可能想嘗試這樣的訂單選項:

:order => 'isnull(houses.name), houses.name, customers.last_name' 

實現你指定的。

+0

該查詢僅返回具有歷史記錄的人員而非沒有記錄的人員。即使你沒有歷史記錄,是否還有客戶還會回來? – Josh 2010-08-04 08:24:23

+0

好奇。這對我在本地工作。即使沒有歷史記錄,外連接也應該返回客戶。你可以看看你的日誌,看看那個查找產生了什麼SQL查詢嗎? – Shadwell 2010-08-04 08:59:25

+0

謝謝!只是改變了查詢使用:包括現在它的作品 – Josh 2010-08-04 09:00:40

0

IMO它更簡單做在軌道上的排序邏輯,而不是在數據庫的:

customers = Customer.find(:all, :conditions => { :id => intersection }, :include => [ { :histories => :houses } ]) 

customers.sort_by { |c| c.last_name } 
customers.sort_by do |c| 
    current_house = c.histories.find_by_finish_date(nil) # Returns nil if no matching record found 
    if current_house 
    current_house.name 
    else 
    '' 
    end 
end 

說明

  • :條件可以採用散列{:列名=>數組}這轉化爲你在條件
  • :包括:如果對應的預負載(eager loading)的表協會存在。換言之::連接創建INNER JOIN,while:include創建LEFT JOINs。在這裏,我們將離開加入歷史,並再次離開加盟房屋。你可以忽略這個:include標籤,在這種情況下,每次訪問歷史記錄或房屋屬性時,rails都會執行新的查詢。
  • sort_by允許定義自定義排序標準。
  • find_by_finish_date是rails的魔法之一;它相當於h.find(:conditions => {:finish_date => nil })
  • 如何輸出:只需在視圖中輸出它們全部。如果他沒有歷史,customer.histories是一個空數組。
+0

感謝您的回覆。我爲我的問題添加了一個例子。我的問題是希望更清楚:) – Josh 2010-08-03 17:06:17

+0

這樣可以嗎? – giraff 2010-08-03 17:22:14

+0

我明白你的意思,但即時通訊的問題在於你如何找到回報客戶的細節,即使他們沒有歷史記錄? – Josh 2010-08-03 20:12:56