2010-12-12 35 views
1

Je souhaite joindre des tables arborescentes et accéder aux données de TOUTES les tables et pas une seule.Récupération des données de toutes les tables d'une requête de jointure dans Rails 3

Les trois tables sont appelées: Page, Texte, Image.

J'ai essayé avec cela, mais cela n'a pas fonctionné:

@texts = Page.joins([:texts, :images]).where(['pages.id = ?', @page]) 

La principale est la page qui textes has_many et images. Je veux faire une requête et obtenir les données de tous en une seule requête. Comment est-ce possible dans Rails 3? Je ne trouve pas un bon exemple nulle part, pas même dans les guides officiels.

Mise à jour

La raison de faire cela au lieu de @ page.texts et @ page.images est parce que je ne peux alors les imprimer en « blocs ». Je veux mélanger Textes et Images lors de l'impression.

+0

Vos trois tables sont-elles liées via des modèles, avez-vous des associations entre elles? –

+0

Oui, dans Page j'ai "has_many: text,: images" et dans le texte et l'image j'ai eu la page belongs_to:. –

Répondre

2

Peut-être que vous pouvez faire Texte et Image sous-classes d'un nouvel élément de page, de sorte que vous pouvez établir o une relation entre les éléments de la page et votre page. De l'autre côté, vous pouvez utiliser Page.join(:texts).select('texts.*') et récupérer des colonnes dans la table des textes en tant que colonnes virtuelles d'un objet Page (Vous pouvez avoir un objet Page avec seulement des colonnes virtuelles d'autres champs de tables, donc cette solution peut être sale) .

0

Quelques choses:

  • Jetez un oeil à cette page d'aide avec les jointures. Remarquez l'option: include qui vous permettra d'obtenir toutes les données sur la requête pour des raisons de performances. Vous aurez toujours besoin d'y accéder via ActiveRecord (voir ci-dessous).

    http://www.railway.at/articles/2008/04/24/database-agnostic-database-ignorant/

  • Avez-vous besoin de toutes les données dans un hachage géant/tableau? Si vous avez des associations configuration, vous pouvez simplement faire:

    @texts = @page.texts et @images= @page.images

Modifier: Qu'en est-ce

@pages = Page.all(:include => [:texts, :images]) 
@pages.sort!{|a,b| a.texts.count <=> b.texts.count} 

Documentation: http://ruby-doc.org/core/classes/Array.html#M002186

+0

Oui, cela fonctionne très bien, mais la raison pour laquelle je dois l'obtenir dans une requête est que je peux commander les éléments lors de l'impression. Si j'utilise @ page.images et @ page.texts je ne peux les obtenir qu'en "blocs" et ne pas les mélanger. –

+0

Merci! Mais je ne pense pas que cela m'aidera. Je n'arrive pas à comprendre pourquoi il n'y a pas de documentation à ce sujet.Je veux juste obtenir tous les Textes et Images appartenant à la Page dans une requête et être capable de les montrer dans l'ordre de création. Mélangez-les, de sorte qu'il y aura peut-être un bloc de texte suivi d'une image et d'un autre bloc de texte. Est-ce que ce n'est pas possible? C'était simple dans Codeigniter (PHP). –