0
votes

Rails Sélectionnez par le nombre d'enregistrements associés

J'ai suivi des modèles dans mes rails app:

class Student < ApplicationRecord
  has_many :tickets, dependent: :destroy
  has_and_belongs_to_many :articles, dependent: :destroy

class Article < ApplicationRecord
  has_and_belongs_to_many :students, dependent: :destroy

class Ticket < ApplicationRecord
  belongs_to :student, touch: true


4 commentaires

Pouvez-vous montrer ce que vous avez essayé jusqu'à présent?


Avez-vous vraiment besoin d'une personne à charge :: Détruire pour l'association des étudiants dans l'article, qui entraînent une suppression du dossier de l'étudiant sur la suppression de l'article correspondant.


@Dileepnandanam aussi loin que je comprends, seuls les records de table jointe sont supprimés et non les enregistrements eux-mêmes.


@Tuuesdayfouram Cela ne fait pas l'une d'entre elles pour les associations HABTM, voir Stackoverflow.com/Questtions/2799746/...


3 Réponses :


2
votes

vous avez demandé "J'ai besoin d'extraire tous les étudiants qui ont moins que des articles" . Je suppose que vous voulez dire "Je dois extraire tous les étudiants qui ont moins que x articles" . Dans ce cas, vous voulez groupe et ayant https://guides.rubyonRails.org/active_record_querying.html#group .

Par exemple, Article.group (: Student_id). Seul ('Compte (Articles)> X'). Cueillette (: Student_id) .

Votre deuxième question, vous pouvez utiliser EDGER Loading https://guides.rubyonRails.org /active_record_querying.html#eagerger-loading-associations Pour accélérer votre code. xxx


3 commentaires

Merci. Je reçois une erreur Erreur bien que ActiveRecord :: relevéinvalid (pg :: groupingError: erreur: colonne "articles.id" doit apparaître dans le groupe par clause ou être utilisé dans une ligne de fonction globale 1: sélectionnez "Articles". * Des "articles". Groupe par "articles". "Stu ... ^: Sélectionnez" Articles ". * Du groupe" Articles "par" articles "." Student_id "ayant (comptage (articles.id) <'5')):


Que vous pour l'indice concernant le chargement impatient - cela a fonctionné pour moi: Studs.Chaque | Client | t = client.tickets.last si t && pt.include? (T.PT) Ticket_Res << client met "client avec paiement: # {client.name}, # {client.id}, # {client.ticalse.last .pt} "fin de fin


Ah, j'ai édité la réponse et ajouté le .pluck (: étudiant_id) pour adresser les plaintes de Postgres. Ce Stackoverflow.com/questions/16418504/pgerRor-in- L'utilisation de groupe-by-CLA POST explique pourquoi vous en avez besoin



2
votes

Allez avec la réponse de @ MCI pour votre première question. Mais un filtre / select / trouva_all ou autre (bien que je n'ai pas entendu parler de la méthode de filtrage dans RUBY) à travers l'enregistrement des élèves prend n requêtes où n est le nombre d'enregistrements de l'étudiant (appelé une requête N + 1).

studs = Student.find_by_sql(%{select tmp.id from (
  select student_id as id from tickets where name='Something' order by tickets.created_at desc
) tmp group by tmp.id})


1 commentaires

Merci. Le problème est que je n'ai besoin de sélectionner que si le dernier enregistrement a ce nom, pas d'entre eux.



1
votes

Ici, l'association est HABTM, donc la requête doit fonctionner xxx


0 commentaires