Ruby on Rails - How zum verknüpfen von zwei Tabellen?
Habe ich zwei Tabellen (Patienten und Seiten) in eins-zu-viele-Beziehungen. Ich möchte hinzufügen Kriterien von Personen, als auch Seiten zu Parsen eines sql, aber die Fortschritte waren sehr langsam und öfters mal in Probleme laufen. Ich bin ganz neu in rails, bitte um Hilfe.
class Subject < ActiveRecord::Base
has_many :pages
end
class Page < ActiveRecord::Base
belongs_to :subject
end
Beispieldaten in den Fächern, aufgeführt drei Spalten unten:
id name level
1 'Math' 1
6 'Math' 2
...
Sample-Daten in Seiten, Spalten aufgeführt unter:
id name subject_id
-- -------------------- ----------
2 Addition 1
4 Subtraction 1
5 Simple Multiplication 6
6 Simple Division 6
7 Hard Multiplication 6
8 Hard Division 6
9 Elementary Divsion 1
Gegeben, ich weiß nicht das Thema.id, ich weiss nur das Thema Namen und level, und name der Seite. Hier ist die sql, die ich erzeugen will (oder etwas ähnliches, das würde das gleiche Ergebnis zu erzielen):
select subjects.id, subjects.name, pages.id, pages.name from subjects, pages
where subjects.id = pages.subject_id
and subjects.name = 'Math'
and subjects.level = '2'
and pages.name like '%Division' ;
Ich erwarten, um zwei Zeilen in das Ergebnis:
subjects.id subjects.name pages.id pages.name
----------- ------------- -------- -----------
6 Math 6 Simple Division
6 Math 8 Hard Division
Dies ist eine sehr einfache sql, aber ich habe nicht in der Lage zu bekommen, wollte ich in rails.
Here is my rails console:
>> subject = Subject.where(:name => 'Math', :level => 2)
Subject Load (0.4ms) SELECT `subjects`.* FROM `subjects` WHERE `subjects`.`name` = 'Math' AND `subjects`.`level` = 2
[#<Subject id: 6, name: "Math", position: 1, visible: true, created_at: "2011-12-17 04:25:54", updated_at: "2011-12-17 04:25:54", level: 2>]
>>
>> subject.joins(:pages).where(['pages.name LIKE ?', '%Division'])
Subject Load (4.2ms) SELECT `subjects`.* FROM `subjects` INNER JOIN `pages` ON `pages`.`subject_id` = `subjects`.`id` WHERE `subjects`.`name` = 'Math' AND `subjects`.`level` = 2 AND (pages.name LIKE '%Division')
[#<Subject id: 6, name: "Math", position: 1, visible: true, created_at: "2011-12-17 04:25:54", updated_at: "2011-12-17 04:25:54", level: 2>, #<Subject id: 6, name: "Math", position: 1, visible: true, created_at: "2011-12-17 04:25:54", updated_at: "2011-12-17 04:25:54", level: 2>]
>>
>> subject.to_sql
"SELECT `subjects`.* FROM `subjects` WHERE `subjects`.`name` = 'Math' AND `subjects`.`level` = 2"
>> subject.size
1
>> subject.class
ActiveRecord::Relation
1. Erklärung: subject = Betreff.where(:name => 'Mathematik', :level => 2)
2. Aussage: Thema.joins(:pages).where(['Seiten.Namen WIE ?', '%Division'])
Fragen:
- der Ergebnisse der verketteten sql wirklich gibt zwei Zeilen, aber Thema.die Größe sagt nur 1?
- Wie sage ich es zurückgeben Spalten von :Seiten?
- Warum unterliegen.to_sql zeigt immer noch die sql-Anweisung 1 nur, warum hat es nicht die verkettete sql-Anweisung 2?
- Im wesentlichen, was brauche ich, um schreiben Sie die Aussagen anders zu analysieren, die sql, wie oben aufgeführt (oder das gleiche Ergebnis zu erzielen)?
Vielen Dank.
InformationsquelleAutor jmsia | 2011-12-19
Du musst angemeldet sein, um einen Kommentar abzugeben.
1) ActiveRecord wird Karte Ihre Suchergebnisse zu Objekte nicht willkürlich zurückgegebenen Zeilen, so da Sie auf der Basis der query-Erstellung aus der
Subject
Klasse es ist, betrachten Sie die Zeilen und zahlen die aus, dass es nur mit Bezug auf 1 einzigartigenSubject
Objekt, so kehrt nur, dass einzelneSubject
Instanz.2) Die Spalte Daten gibt es, aber Sie arbeiten gegen das, was ActiveRecord will geben Sie, die Objekte. Wenn du lieber Seiten zurückgegeben, dann müssen Sie als Grundlage für die Erstellung der Abfrage auf die
Page
Klasse.3) Du hast nicht speichern Sie die Ergebnisse der addition der
join(:pages)...
zurück in diesubject
variable. Wenn Sie nicht:Ist, erhalten Sie das vollständige Abfrage beim ausführen
subject.to_sql
4) man-Seite-Objekten Sie können so etwas wie dies tun, beachten Sie, dass wir bauen es aus der
Page
Klasse:Dann Zugriff auf den Namen des Antragstellers, von dort zum ersten
Page
- Objekt zurückgegeben:Welche, weil Sie die Verknüpfung in der ersten, nicht in eine andere SQL-Abfrage. Hoffe, das hilft!
InformationsquelleAutor ctcherry