2013-02-24 1 views
4

et b sont des objets ActiveRecord :: Relation qui retournent le même type d'objets (objets Micropost dans ce cas Y a-t-il un moyen de "OU" à la fois les objets Relation et de renvoyer un autre objet Relation dans Rails 3.2.11? Ai-je besoin d'utiliser une gemme telle que squeel pour le faire?Combiner deux ActiveRecord :: Relation avec OR, pas AND, renvoyer une Relation et non un Array pour pouvoir paginer plus tard

Si cela n'est pas possible: pourquoi cela ne peut-il être fait? Puis-je paginer le tableau résultant de a|b sans charger chaque enregistrement de la base de données?
Si cela peut être fait: Quelqu'un pourrait-il écrire un exemple de comment le faire?

Merci d'avance.

EDIT: J'ai copié les mauvaises variables dans le bloc de code, b n'était pas une ActiveRecord :: Relation, c'était en fait un tableau et c'est pourquoi un .merge (b) renvoyait []. Ma faute.

TLDR: La question est mal, et tableau peut être paginé :)

Répondre

2

Pour vous la question: Can I paginate the array resulting from a|b without loading every record from the database?

Oui, vous pouvez paginer array. Seulement vous devez faire est require 'will_paginate/array' fichier où vous utilisez paginate pour array. Si vous utilisez à plusieurs endroits, il est préférable de l'ajouter dans config/initializers. Et son tableau de sorte qu'il ne chargera pas tous les enregistrements de la base de données chaque fois qu'une requête (c'est-à-dire) est déclenchée une seule fois. Pour charger l'association, vous pouvez utiliser eager load on array en utilisant include.

+0

Tout d'abord merci pour votre réponse !. Une autre question, paginer sur un objet Relation est de charger 30 objets de la base de données chaque page. Si je fais 'c = a | b' et paginez ce tableau, il chargera tous les enregistrements à la fois de la base de données dans un tableau et montrera 30 d'entre eux pour chaque page. Si le nombre d'enregistrements est très élevé, cela pourrait être un problème. Dois-je faire quelque chose comme 'c = a.limit (200) .offset (@ page * 30) | b.limit (200) .offset (@ page * 30) 'pour éviter cela? Est-ce que quelque chose comme ça fonctionnerait et est-ce la façon la plus facile de le faire? – ICTylor

+0

Une chose que je ne comprends pas pourquoi obtenez-vous les mêmes relations actives dans deux objets différents et les combiner ?? Pourquoi n'écrivez-vous pas une seule requête pour obtenir des résultats? – codeit

+0

L'un d'entre eux est retourné d'une fonction avec une requête where (fonction User.feed), l'autre est renvoyé via une association (User.mentioned_in où named_in est une association définie par: has_many: mentionné_in, à travers:: mention_relationships, source :: poste etc.), les deux objets relationnels ne sont pas les mêmes. Pour écrire une seule requête je devrais aussi écrire la requête pour l'association et les rejoindre. Je suppose qu'à la fin je devrais le faire de cette façon, mais je pensais qu'il pourrait y avoir une autre (meilleure) façon de le faire sans changer beaucoup de code. – ICTylor

Questions connexes