我不是数据库和关系逻辑方面的专家,我对在以下情况下我必须做的事情感到有点困惑。
我有一个模型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
关系不仅返回TranslationPair
字段中具有给定表达式的exp_1
个实例,还返回给定TranslationPair
个实例exp_2
字段中的表达式(如果expression1
是expression2
的翻译,则expression2
是expression1
的翻译。 child_key
选项中的一种分离。类似的东西:
has n, :translation_pairs, child_key: [:exp_1_id] or [:exp_2_id]
我可以直接在模型声明中实现它,还是必须实现一些自定义方法?
答案 0 :(得分: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
如果没有,您可能会被迫在Expression对象上使用自定义方法,例如:
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