【问题标题】:How do I get a value from a composite key table using a Rails model?如何使用 Rails 模型从复合键表中获取值?
【发布时间】:2010-03-02 17:34:50
【问题描述】:

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

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 查询的标准方法?

【问题讨论】:

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


    【解决方案1】:

    不清楚是否需要 CRUD 操作。如果你想找到,那么你可以执行以下操作:

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

    【讨论】:

      【解决方案2】:

      您有没有研究过任何“现成”的翻译系统,而不是使用自己的翻译系统?

      例如,Globalize 为您做了很多这样的事情。

      拥有一个带有复合键的表来表示从表中的一条记录到另一条记录的连接会很麻烦。通常,您需要将 AB 关联保持为一对 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') %>
      

      【讨论】:

      • 嗯,我不确定这个模式是否完全符合我的场景,但它非常接近,我肯定会研究这个。谢谢!
      【解决方案3】:

      听起来您可能想要Polymorphic Associations 之类的东西。这将需要每种语言都有一个单独的表格,这就是(我认为)您正在讨论的内容。

      不过,您的问题似乎有更好的解决方案。特别是,您也许可以想出一个更好的架构来解决这个问题(除非数据库已经在使用并且您正在创建一个 Rails 应用程序来尝试访问它)。

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

      【讨论】:

      • 事情仍处于设计阶段,因此架构可以更改。我对想法持开放态度。基本上,用户将以他们的母语(例如意大利语)查看该网站,然后他们可以查看他们可以学习的其他语言(例如法语)的列表。所以他们点击法语,它会出现意大利语使用者的法语概述页面。因此,页面标题会显示 Francese(意大利语中的法语),而内容会显示翻译成意大利语的法语概述。
      • 您的意思是,为法语创建一个表,为英语创建一个表,为西班牙语创建一个表?谢谢你的建议,但我真的一点也不喜欢这个主意。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-17
      • 2017-10-02
      • 2015-11-17
      相关资源
      最近更新 更多