J'ai deux tables (sujets et pages) dans les relations un-à-plusieurs. Je veux ajouter des critères de sujets ainsi que des pages pour analyser un sql, mais les progrès ont été très lents et souvent en cours d'exécution. Je suis tout nouveau dans les rails, s'il vous plaît aider.Ruby on Rails - Comment joindre deux tables?
class Subject < ActiveRecord::Base
has_many :pages
end
class Page < ActiveRecord::Base
belongs_to :subject
end
données d'échantillons chez les sujets, figurent trois colonnes ci-dessous:
id name level
1 'Math' 1
6 'Math' 2
...
données exemples dans les pages, les colonnes ci-dessous:
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
Étant donné que je ne connais pas le sujet. id, je ne connais que le nom et le niveau du sujet, et le nom de la page. Voici le sql que je veux générer (ou quelque chose de similaire qui permettrait d'atteindre le même résultat):
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' ;
Je me attends à obtenir deux lignes dans le résultat:
subjects.id subjects.name pages.id pages.name
----------- ------------- -------- -----------
6 Math 6 Simple Division
6 Math 8 Hard Division
Ceci est un sql très simple , mais je n'ai pas pu obtenir le désir que je voulais dans les 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ère déclaration: subject = Subject.where (: name => 'Math',: niveau => 2) 2ème: Déclaration subject.joins (: pages) .où ([ 'pages .name LIKE », '% Division'])
questions:
- les résultats de la chaîne SQL retourne vraiment deux lignes, mais subject.size dit seulement 1?
- Comment puis-je lui dire de retourner des colonnes de: pages aussi?
- Pourquoi subject.to_sql n'affiche toujours que l'instruction sql from 1, pourquoi n'a-t-il pas inclus l'instruction sql chaînée from 2?
- Essentiellement, de quoi ai-je besoin pour écrire les instructions différemment pour analyser le sql comme indiqué ci-dessus (ou obtenir le même résultat)?
Merci beaucoup.
Brillant! Merci beaucoup. Vous répondez à toutes mes questions, ça marche bien maintenant. :-) – jmsia