1
class Category 
    has_many :images 
    has_many :articles 
end 

class Image 
    belongs_to :category 
end 

class Article 
    belongs_to :category 
end 

J'essaie de comprendre quelles solutions existent dans Rails pour les enfants de différents modèles à interroger par le même parent?Obtenir des enfants de différents modèles dans une seule requête

E.g. J'aimerais obtenir toutes les images et les articles qui appartiennent à la même catégorie et les classer tous par created_at.

+0

Je ne pense pas que ce soit [l'association multiple de chargement hâtif] (http://guides.rubyonrails.org/active_record_querying.html#eager-loading-multiple-associations)? – matiss

+0

Je pense que charge tous les 'Articles' dans leur exemple' Article.includes (: category,: comments) '? Mais j'aimerais voir un exemple de travail si vous en avez un! –

+0

Exemple dans Rails "Ceci charge tous les articles et la catégorie et les commentaires associés pour chaque article". Probablement dans votre cas, il pourrait être 'Category.includes (: images,: articles)' où 'Category' est l'un avec votre ID désiré. – matiss

Répondre

0

Vous pouvez essayer 'comprend' dans des rails Article.includes (Catégorie:)

+0

Mind montrant un exemple comment cela pourrait être utilisé dans ce contexte? –

0

Comme je l'ai dit, il me semble que vous pouvez utiliser eager loading multiple associations. Dans votre cas, il pourrait être quelque chose comme ceci:

Category.where(id: 2).includes(:images, :articles).sort_by(&:created_at)

Fondamentalement, vous passez votre choix Category ID et obtenir :images, :articles qui belongs_to catégorie avec ID particulier. sort_by devrait probablement faire le tri.

Cette blog post on eager loading pourrait également vous aider.

0

Vous ne pouvez pas simplement forcer Active Record à amener toutes ses dépendances dans une seule requête (afaik), même si le chargement est paresseux/impatient. Je pense que votre meilleur pari est:

class Category 
    has_many :images, -> { order(:created_at) } 
    has_many :articles, -> { order(:created_at) } 
end 

categories = Category.includes(:images, :articles) 

Tant que vous itérer les catégories et obtenir leurs images et articles, ce feront trois requêtes, une pour chaque table categories, images et articles, ce qui est un bon compromis entre la facilité d'utilisation d'un ORM.
Maintenant, si vous insistez pour apporter toutes ces informations dans une seule requête, il est certain que cela doit être un moyen d'utiliser Arel, mais réfléchissez-y deux fois si cela vaut la peine. Le dernier choix que je vois est le bon vieux SQL avec:

query = <<-SQL 
    SELECT *, images.*, articles.* 
    FROM categories 
    -- and so on with joins, orders, etc... 
SQL 

result = ActiveRecord::Base.connection.execute(query) 

Je dissuadent vraiment cette option car il apportera beaucoup d'informations dupliquée comme vous joindre à trois tables et il serait vraiment une douleur pour les trier pour votre utilisation