2015-11-06 17 views
1

給出一個foo表,一個條形表和一個foos_bars表,所有這三個表都帶有id列,文檔似乎暗示的獲取條形圖的方法是使用foos是這樣的:如何通過Ruby對象映射器中的連接表加入SQL

class Foo < ROM::Relation[:sql] 
    def with_foos_bars 
    qualified.inner_join(:foos_bars, foo_id: :id) 
    end 

    def with_bars 
    with_category_fixtures.qualified.inner_join(:categories, id: :bar_id) 
    end 
end 

然而,#qualified只適用於類,所以這實際上只是排位賽「富」了兩次,但我們需要限定至少兩個表的使用SQL查詢。 #prefix的情況似乎也是這樣。忽略#限定和前綴只會導致模糊的SQL查詢。

澄清:問題是如何通過Ruby Object Mapper中的連接表進行連接?

+0

我敢肯定有一個問題在那裏等待被問到,但我沒有看到它。也許你可以重寫一下,使你所要求的更清楚?請閱讀「[問]」。 –

+0

問題是標題,我剛剛添加到身體。 –

+0

標題是一個聲明,並遵循SO的建議聲明形式,但是身體中的問題需要以「?」結尾。雖然這看起來很迂腐,但清楚地界定問題很重要。 –

回答

1

您需要使用與續集命名約定符號列名了,所以這樣的事情:

class Foo < ROM::Relation[:sql] 
    def with_foos_bars 
    qualified.inner_join(
     foos_bars, foos_bars__foo_id: foos__id 
    ) 
    end 

    def with_bars 
    with_category_fixtures.qualified.inner_join(
     :categories, categories__id: :foos_bars__bar_id 
    ) 
    end 
end 

的計劃是提供將簡化新的接口,但我得說這個簡單的命名約定一直在爲我工作得很好。話雖如此,這裏肯定有改進的地方。

我希望這會有所幫助。

+0

Thanks @solnic,我認爲這是有效的(第二個#qualified調用,在#with_bars中,省略)。然而,結果(給出一個與一個foo關聯三個小節和添加#select_append調用的數據庫)是三個條形碼哈希每個包含相同的foo散列而不是包含三個條的foo散列。我想這沒有錯,只是令人驚訝。 –

+0

不幸的是,這種方法似乎讓一個結果不能用於獲取foos和bars,例如,如果foos和bar都具有name屬性,則生成的foos似乎具有bar的名稱。我認爲。這個連接處理是一個真正的困惑者。 –

+0

您需要限定所有表格並重命名衝突列,以便它們是唯一的。正因爲這個原因,通常通過'combine'使用急切加載要簡單得多。 – solnic