2010-03-02 21 views
0

我有以下模式(*表示主键):如何使用Rails模型从组合键表中获取值?

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

回答

0

这听起来像你可能想要像Polymorphic Associations。这将需要一个单独的表,每种语言,这是(我认为)你在讨论什么。

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

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

+0

东西仍然在设计阶段,这样的模式可以改变。我愿意接受创意。基本上,用户将以他们的母语(例如,意大利语)查看该网站,然后他们可以查看他们可以学习的其他语言(例如法语)的列表。所以他们点击法语,并为意大利人发布法语概览页面。因此,Francese(法语的意大利语)会显示页面标题,并将法语翻译为意大利语的概述显示为内容。 – 2010-03-02 18:27:49

+0

你的意思是说,创建一个法语表,一个英文表,一个西班牙语表?感谢您的建议,但我真的不喜欢这个想法。 – 2010-03-02 21:37:58

2

它不是很清楚你是否需要CRUD操作。如果你想找到那么你可以做到以下几点:

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

而不是滚动自己的翻译系统,你有没有调查任何“现成”品种?

例如有Globalize这对你有很大的帮助。

拥有一个带有复合键的表格,表示从表格中的一条记录到另一条记录的连接将会非常麻烦。一般来说,您需要将A关联作为一对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') %> 
+0

嗯,我并不完全相信这个模式完全符合我的情况,但它非常接近,我绝对会考虑这一点。谢谢! – 2010-03-02 19:55:29

相关问题