2016-11-28 2 views
1

Ich habe ein Modell Buch wie folgt aussehen:Suche Verein mit class_name

class Book < ActiveRecord::Base 
    belongs_to :author, class_name: 'User', touch: true 
    belongs_to :translator, class_name: 'User' 
end 

Wie kann ich für Bücher mit bestimmten Autorennamen gesucht? i kommen Sie mit den Tabellen zuerst:

Book.joins(:author).joins(:translator) 

aber ich kann nicht Kette

.where('authors.name = "Tolkien"') 

, weil es keine "Autoren" Tabelle in der Datenbank ist. ist

.where('users.name = "Tolkien"') 

ein sicherer Ansatz hier? Besteht kein Risiko, dass sowohl Übersetzer als auch Autoren tatsächlich Nutzer sind? (select() Methode ist keine Option, ich brauche Active :: Beziehung hier)

+0

Bitte teilen Sie die Datenbankstruktur. Was passiert, wenn das Buch zwei Autoren hat? _drei Übersetzer_? – mudasobwa

+0

können Sie 'where ({author: {name: 'Jon'}, Übersetzer: {name: 'Doe'}})' verwenden oder den Join manuell schreiben und ihm manuell einen Namen geben. –

Antwort

0

Sie müssen in Abfragetabellennamen übergeben

Book.joins(:author).where(users: {name: 'Tolkien'}) 

ist .where('users.name = "Tolkien"') ein sicherer Ansatz hier?

Wenn Sie beide Verbände sind gleiche Tabelle benutzen, müssen Sie möglicherweise ein Feld hinzufügen sie

Für die Ex zu unterscheiden. ein boolesches Feld author und verwenden Bedingung mit Zuordnung, die das Problem lösen wird

class Book < ActiveRecord::Base 
    belongs_to :author, -> { where(author: true) }, class_name: 'User', touch: true 
    belongs_to :translator, -> { where(author: false) }, class_name: 'User' 
end 
+0

es ist keine Lösung, die ich verwenden kann, da Benutzer ein Autor für ein Buch und Übersetzer für die anderen – Leo

+0

sein kann Dann sind Sie in Ordnung mit der Tatsache, dass die Abfrage die Bücher zurückgibt, wo der Benutzer Autor sowie Übersetzer ist –