ruby datamapper - 对称自引用多对多关系

时间:2013-05-30 15:14:41

标签: ruby database-design orm ruby-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关系不仅返回TranslationPair字段中具有给定表达式的exp_1个实例,还返回给定TranslationPair个实例exp_2字段中的表达式(如果expression1expression2的翻译,则expression2expression1的翻译。 child_key选项中的一种分离。类似的东西:

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

我可以直接在模型声明中实现它,还是必须实现一些自定义方法?

1 个答案:

答案 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