2010-12-07 8 views
0

J'ai un modèle Factsheet qui contient un assortiment de publications, y compris des versions en plusieurs langues. Les différentes versions linguistiques doivent être séparées en tant qu'enregistrements individuels (parce qu'ils peuvent être commandés/mis à jour/etc. Séparément), mais j'essaie de les associer les uns aux autres afin que vous puissiez facilement savoir quand une publication est l'espagnol (ou Version chinoise, etc.) de l'autre.Rails has_one: par le biais de l'association pour autoréférentiel 1-to-1-to-1

Je voudrais utiliser une association :through afin que la relation soit symétrique, par ex. si l'anglais Factsheet A a une version espagnole Fiche B, alors B Fiche d'information a de même une version anglaise Fiche d'information A.

Voici mes modèles:

class Factsheet < ActiveRecord::Base 
    has_many :publications_language_relationships 
    has_one :en, :through => :publications_language_relationships 
    has_one :es, :through => :publications_language_relationships 
    has_one :zh, :through => :publications_language_relationships #zh = Chinese 

    # other stuff 
end 

et ...

# Table name: publications_language_relationships 
# 
# en_id  :integer 
# es_id  :integer 
# zh_id  :integer 
# 
class PublicationsLanguageRelationship < ActiveRecord::Base 
    belongs_to :en, :class_name => 'Factsheet' 
    belongs_to :es, :class_name => 'Factsheet' 
    belongs_to :zh, :class_name => 'Factsheet' 
end 

Mais quand je lance une console Rails pour vérifier si cela fonctionne du tout ...

$ fs = Factsheet.last 
=> #<Factsheet id: 5, title: "Despu\xC3\xA9s de un diagn\xC3\xB3stico de c\xC3\ 
xA1ncer de seno: Con...", backend_code: "fs_after_bc_diagnosis_es", language: 
"es", created_at: "2010-11-30 21:23:01", updated_at: "2010-12-06 16:13:23"> 

$ fs.en 
ActiveRecord::StatementInvalid: SQLite3::SQLException: no such column: publicati 
ons_language_relationships.factsheet_id: SELECT "factsheets".* FROM "factsheets" 
INNER JOIN "publications_language_relationships" ON "factsheets".id = "publicat 
ions_language_relationships".en_id WHERE (("publications_language_relationships" 
.factsheet_id = 5)) LIMIT 1 

Alors quelque chose Ça ne va pas avec mes associations, mais je ne sais pas trop quoi. Pensées?

De plus, est-ce que c'est même une conception sonore pour les données, ou devrais-je faire quelque chose de différent ici?

Répondre

1

Je ne l'ai pas testé cette solution, mais je pense que la direction générale d'architecture que vous voulez prendre est pas vraiment à travers: à travers une relation, mais plutôt quelque chose comme:

class Factsheet < ActiveRecord::Base 
    has_many :publications_language_relationships 

    named_scope :translation, lambda { |trans| 
     { :conditions => ["publications_language_relationships = ?", trans.to_s ] , 
     :joins => :publications_language_relationships 
     } 
    } 

    # other stuff 
end 

class PublicationsLanguageRelationship < ActiveRecord::Base 
    belongs_to :fact_sheet 
end 

Et puis, je pense que vous « appellerais les traductions dans votre contrôleur/vues quelque chose comme ceci:

#controller 
def show 
    @fact_sheet = FactSheet.find(params[:id]) # to load up the FactSheet 
end 

#view (to get the right translation) 
@fact_sheet.translation(:en) #for english 

Je ne pense pas que ce soit tout à fait raison, mais il devrait vous mettre sur le chemin de toute façon.

Questions connexes