1

我不是数据库和关系逻辑方面的专家,我对在以下情况下必须做什么感到有些困惑。

我有一个模型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]

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

4

1 回答 1

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
于 2013-06-27T22:24:41.977 回答