Rails le meilleur moyen d'obtenir l'objet d'enregistrement actif précédent et suivant
J'ai besoin d'obtenir de la précédente et de la suivante active record des objets avec des Rails. Je l'ai fait, mais ne sais pas si c'est la bonne façon de le faire.
Ce que j'ai:
Contrôleur:
@product = Product.friendly.find(params[:id])
order_list = Product.select(:id).all.map(&:id)
current_position = order_list.index(@product.id)
@previous_product = @collection.products.find(order_list[current_position - 1]) if order_list[current_position - 1]
@next_product = @collection.products.find(order_list[current_position + 1]) if order_list[current_position + 1]
@previous_product ||= Product.last
@next_product ||= Product.first
product_model.rb
default_scope -> {order(:product_sub_group_id => :asc, :id => :asc)}
Donc, le problème, ici, c'est que j'ai besoin d'aller à ma base de données et d'obtenir tous les identifiants de savoir qui est le précédent et le suivant.
Essayé d'utiliser la gem order_querymais il ne fonctionne pas pour moi et j'ai constaté que cela se passe de la base de données et récupérer tous les enregistrements dans l'ordre, donc c'est pourquoi j'ai fait de même mais qui ne boit que de l'ids.
Toutes les solutions que j'ai trouvé était simple ordre des requêtes sur. Order by id ou quelque chose comme un domaine prioritaire.
source d'informationauteur William Weckl | 2014-09-04
Vous devez vous connecter pour publier un commentaire.
Il n'y a rien de facile, out-of-the-box solution.
Un peu sale, mais la façon de travailler est soigneusement le tri quelles sont les conditions pour trouver l'élément suivant ou précédent. Avec
id
c'est assez facile, puisque tous lesid
s sont différents, et Rails de Guy répondre décrit juste que: dansnext
pour unid
choisir une première entrée avec un grandid
(si les résultats sont classés parid
comme par défaut). Plus que cela, sa réponse astuces pour placernext
etprevious
dans la classe du modèle. Le faire.Si il y a plusieurs critères d'ordreles choses se compliqué. Dire, nous avons un ensemble de lignes triées par
group
premier paramètre (qui peut éventuellement avoir des valeurs identiques sur des lignes différentes), puis parid
(id différent partout, garanti). Les résultats sont classés pargroup
puis parid
(les deux croissant), de sorte que nous pouvons éventuellement rencontrer deux situations d'obtenir l'élément suivant, c'est le premier de la liste qui comporte des éléments, qui (ainsi, de nombreux que):group
et un plusid
group
Même avec de l'élément précédent: vous avez besoin de la dernière de la liste
group
et un petitsid
group
Ceux fetch tous suivant et précédent entrées respectivement. Si vous avez besoin d'un seul, l'utilisation de Rails
first
etlast
(comme suggéré par Rails Gars) oulimit(1)
(et méfiez-vous de la asc/desc de la commande).Écrire ces méthodes dans votre
Product
modèle:Maintenant vous pouvez le faire dans votre contrôleur:
Merci de l'essayer, mais ce n'est pas testé.
Grâce
Je pense qu'il serait plus rapide de le faire avec seulement deux requêtes SQL, qui ne sélectionner deux lignes (et non pas l'ensemble de la table). Considérant que votre ordre par défaut triés par id (sinon, à force de les trier par id) :
Si le produit est la dernière, alors @next_product sera nul, et si c'est le premier, alors, @previous_product sera nul.
C'est ce que order_query. S'il vous plaît essayer la version la plus récente, je peux vous aider si elle ne fonctionne pas pour vous:
Il exécute une requête de chargement que l'enregistrement suivant. Lire plus sur Github.