如何使用Rails模型从复合键表中获取值?

时间:2010-03-02 17:34:51

标签: ruby-on-rails model composite-key

我有以下架构(*表示主键):

languages
  id*
  english_name
  native_name

native_to_target_language
  native_language_id*
  target_language_id*
  target_language_name
  overview_text

(target_language_name是用母语编写的目标语言的名称)。

我希望在native_language_id和target_language_id的值中从native_to_target_language表中获取target_language_name的值。

最好的方法是什么?使用http://compositekeys.rubyforge.org/中的复合主键?有没有使用原始SQL查询的标准方法?

3 个答案:

答案 0 :(得分:2)

如果您需要CRUD操作,则不太清楚。如果您想找到,那么您可以执行以下操作:

NativeToTargetLanguage.find(:all, :conditions => {
        :native_language_id => native_language_id,
        :target_language_id => target_language_id }
)

答案 1 :(得分:1)

您是否已经调查了任何“现成”品种,而不是推出自己的翻译系统?

例如Globalize可以为你做很多事情。

拥有一个带有复合键的表,表示从表中的一个记录到另一个记录的连接将会非常麻烦。通常,您需要将A - B关联维持为一对A-> B和B-> A变种。

作为一般例子如何:

class Language < ActiveRecord::Base
  belongs_to :phrase
  has_many :translations,
    :through => :phrase
end

class Phrase < ActiveRecord::Base
  has_many :translations
end

class Translation < ActiveRecord::Base
  belongs_to :language
  belongs_to :phrase
end

在这种情况下,短语是一种表示要翻译的术语的记录。根据具体情况,它可以代表“法语”或“英语”或“点击此处”。

使用这种结构,可以直接找到用您定义的任何语言描述语言的正确术语。

例如,粗略地说:

<%= link_to(Language.find_by_code('fr').phrase.translation.find_by_language_id(session_language_id), '/fr') %>

答案 2 :(得分:0)

听起来你可能想要像Polymorphic Associations这样的东西。这需要每种语言单独使用一个表,这是(我认为)你正在讨论的内容。

但是,似乎可能有更好的解决方案来解决您的问题。特别是,您可能能够提出更好的模式来解决这个问题(除非数据库已经在使用,并且您正在创建一个Rails应用程序以尝试访问它)。

您能描述一下您试图解决的整体问题吗?