4 Stimmen

Filtern der Join-Tabelle in has_many :through in RoR

Ich habe die folgenden Modelle, in denen ich die Tabelle Sprache und Produkte über die Tabelle Übersetzung mit dem Rails has_many :through-Paradigma verbinden:

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

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

class Product < ActiveRecord::Basehas_many :translations
  has_many :translations
  has_many :languages, :through => :translations
end

Ich möchte die englische Übersetzung für ein bestimmtes Produkt finden.

Ich kann die zugehörigen Sprachen und Übersetzungen auflisten:

prod = Product.find(4)
en = Language.find(:first, :conditions => { :lang_code => 'en' })

puts prod.translations
puts prod.languages

Dies wird gedruckt:

#<Translation:0x11022a4>
#<Translation:0x1102114>
#<Language:0x602070>
#<Language:0x602020>

(Für dieses Produkt gibt es eine englische und französische Übersetzung).

Wie kann ich die Übersetzung für prod entsprechend der en Sprache?

Wenn das keinen Sinn ergibt, hier ist die entsprechende SQL:

SELECT t.* FROM products p, translations t, languages l WHERE l.id = t.language_id AND p.id = t.product_id AND l.lang_code = 'en';

3voto

Alessandra Pereyra Punkte 2640

Sie bräuchten etwas in dieser Richtung:

product = Product.find(4)
translation = product.translations.find(:first,:joins=>:languages, :conditions=>{:language=>{:lang_code=>'en'}})

Der Code erzeugt eine Verknüpfung von Übersetzungen mit Sprachen und filtert entsprechend Ihren lang_code.

Wenn die Klammern Sie ein wenig verwirren (ich weiß, dass sie das manchmal tun), können Sie auch so vorgehen:

translation = product.translations.find(:first,:joins=>:languages, :conditions=>["languages.lang_code like ?",'en'])

Der letzte Teil sollte dieselbe SQL-Abfrage ergeben, die Übersetzungen mit Sprache verbindet und dann nach dem lang_code filtert.

0voto

titaniumdecoy Punkte 18400

Yarahers Antwort funktioniert, obwohl ich einen einfacheren Weg gefunden habe, um das Gleiche zu erreichen:

t = Translation.find(:first, 
                     :conditions => { :product_id => prod.id, 
                                      :language_id => lang.id })

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X