2010-03-02 4 views
0

J'ai le schéma suivant (* signifie clé primaire):Comment obtenir une valeur à partir d'une table de clé composite à l'aide d'un modèle 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 est le nom de la langue cible comme il est écrit dans la langue maternelle).

Je souhaite obtenir la valeur de target_language_name dans la table native_to_target_language en indiquant les valeurs de native_language_id et de target_language_id.

Quelle est la meilleure façon d'obtenir cela? Utiliser les clés primaires composites de http://compositekeys.rubyforge.org/? Existe-t-il une méthode standard SANS utiliser une requête SQL brute?

Répondre

0

Il semble que vous vouliez quelque chose comme Polymorphic Associations. Cela nécessiterait un tableau distinct par langue, ce qui est (je pense) ce dont vous parlez.

Cependant, il semble qu'il pourrait y avoir une meilleure solution à votre problème. En particulier, vous pourriez être en mesure de trouver un meilleur schéma pour résoudre ce problème (à moins que la base de données ne soit déjà utilisée et que vous créez une application Rails pour essayer d'y accéder). Pouvez-vous décrire le problème global que vous tentez de résoudre?

+0

Les choses sont encore dans la phase de conception, de sorte que le schéma peut changer. Je suis ouvert aux idées. Fondamentalement, un utilisateur verra le site dans sa langue maternelle (par exemple, l'italien), puis ils peuvent voir une liste d'autres langues qu'ils peuvent apprendre (disons, le français). Donc, ils cliquent sur le français, et il vient avec la page d'aperçu français pour les italophones. Ainsi, Francese (français en italien) montrerait pour le titre de la page, et un aperçu pour le français traduit en italien montrerait pour le contenu. –

+0

Voulez-vous dire, créer une table pour le français, un pour l'anglais, un pour l'espagnol? Merci pour cette suggestion, mais je n'aime vraiment pas cette idée du tout. –

2

Ce n'est pas très clair si vous avez besoin d'opérations CRUD. Si vous voulez trouver, vous pouvez effectuer les opérations suivantes:

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

Au lieu de rouler votre propre système de traduction, avez-vous des variétés « enquêté sur l'étagère »?

Par exemple, il y a Globalize qui fait beaucoup de cela pour vous. Avoir une table avec une clé composée qui représente une connexion d'un enregistrement dans une table à l'autre va avoir beaucoup de problèmes. Généralement, vous devez maintenir une association A < -> B comme une paire de variétés A-> B et B-> A.

Qu'en est-cela comme un exemple général:

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 

Dans ce cas, l'expression est une sorte d'enregistrement représentant le terme à traduire. Il pourrait représenter "Français" ou "Anglais" ou "Click Here" selon les circonstances.

En utilisant cette structure, il est facile de trouver le terme approprié pour décrire une langue dans n'importe quelle langue que vous avez définie.

Par exemple, à peu près:

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

Hm, je ne suis pas TOTALEMENT sûr que ce schéma correspond exactement à mon scénario, mais il est très proche, et je regarde définitivement dans ce domaine. Merci! –

Questions connexes