2013-07-26 36 views
1

我有一個Rails 3.2應用程序,其中Product是一個模型。 Product包含屬性identifier(永遠不會爲null)和parent_identifier(可能爲空)。當它們存在時,這些關係可以連續多代。如何找到parent_id爲可選的ActiveRecord條目的最終祖先?

我的挑戰是將ProductDetail對象has_manyProduct複製到後續的子產品上。

雖然產品詳細信息可能尚未輸入到最終的祖先中。我只需要沿着鏈條走到我遇到的具有產品細節的祖先產品的地方,然後複製最新產品下的產品。

我怎樣才能走上連鎖店,直到我找到這些產品細節?

*注:identifier字段不是主鍵,這是不實際的做起來很爲parent_identifier來自外部數據庫,甚至可能不存在本地如果是從之前的客戶簽訂了協議。由於每天有數百萬種產品需要保持同步,因此在每次加載時都要檢查這種情況是不現實的。 *

+0

從圖表的角度來講,它是一棵樹嗎?或者它總是一個繼承自其他對象的單個對象(除非它是一個根) –

+0

它總是一個單一的繼承,所以它不是一棵樹。每個葉子只能有一個父親,每個節點只能有一個直接子孫。 – AKWF

+0

而你需要從最後一個(葉/電流)的上游抓取第一個節點[從技術上講,這也是一個樹形圖;]] –

回答

2

如果我正確理解你的挑戰,下面的方法應該爲你提供你要做的事(最近的上游非空ProductDetails集合)。

class Product > ActiveRecord::Base 
    def parent 
    @parent ||= Product.where(identifier: self.parent_identifier).first 
    end 

    def parent_product_details 
    return unless parent 

    upstream_details = parent.product_details 
    upstream_details = parent.parent_product_details if upstream_details.empty? 

    upstream_details 
    end 
end 

讓我知道我是否誤解了這個問題。

+1

這是一個很好的解決方案,我已經驗證它的工作原理。謝謝! – AKWF