2013-05-30 53 views
1

我不是在數據庫和關係邏輯的專家,我有點困惑什麼,我有以下的情況下做的。紅寶石DataMapper的 - 對稱的自我指涉的許多一對多的關係

我有一個模型Expression,我想實現一個TranslationPair自參考多對多的關係。

class Expression 
    include DataMapper::Resource 

    has n, :translation_pairs, child_key: [:exp_1_id] 
end 

class TranslationPair 
    include DataMapper::Resource 

    belongs_to :exp_1, 'Expression', key: true 
    belongs_to :exp_2, 'Expression', key: true 
end 

的問題是,我想translation_pairs關係與在exp_1領域一個表達式返回不但TranslationPair情況下,也TranslationPair情況下與在exp_2場定表達式(如果expression1是一個翻譯expression2,然後expression2expression1翻譯)。 child_key選項中的一種析取。例如:

has n, :translation_pairs, child_key: [:exp_1_id] or [:exp_2_id] 

我可以直接在模型聲明中實現它,還是我必須實現一些自定義方法?

回答

1

有趣的問題!

有沒有辦法做到這一點的描述,只是DataMapper的核心方法。我只是猜測,現在的數據的性質......不過我很好奇,如果你也許可以想出給出了「規範」的任何陳述Expression使得它可能看起來像:

class Expression 
    belongs_to :canonical_translation 
    ... 

    def equivalent_expressions 
    canonical_translation.expressions.all(:id.not => self.id) 
    end 
end 

class CanonicalTranslation 
    property :representation, SomeDataType 
    has n :expressions 
end 

如果沒有,你可能被迫使用自定義的方法表達對象上,是這樣的:

has n, :these_translations, :model => TranslationPair, :child_key => [:exp_1] 
has n, :those_translations, :model => TranslationPair, :child_key => [:exp_2] 

def translation_pairs 
    these_translations + those_translations 
end 
+0

感謝@mltsy。兩種選擇都很有趣。第一個哲學(:))是不錯,但我不覺得舒服改變了我的模型設計(即使它不會太困難)只是一種DataMapper的限制(我不知道,但我認爲我想要在純SQL模式中執行)。我會嘗試第二個,因爲未來的改變會更容易。 –

+0

沒有與另外的'these_translations'和'those_translations'問題。它們是'DataMapper :: Associations :: OneToMany :: Collection',它不是從'Array'繼承的,所以'+'不像預期的連接那樣工作(該方法存在,它使對象變得奇怪涉及的屬性我無法解釋)。解決方案是將它們轉換爲'to_a'。當然你放棄了'收藏'的能力,但是我知道我可以在沒有他們的情況下生活...... –