I didn't know about association filters, let me try to use them and report 
back.

On Sunday, May 31, 2020 at 11:29:25 PM UTC+3, Jeremy Evans wrote:
>
> On Sunday, May 31, 2020 at 12:39:41 PM UTC-7, Aryk Grosz wrote:
>>
>> In the simplest use case,  lets say you have a table classroom_students. 
>> You have a dataset of classrooms and you want to count the students in 
>> those classrooms.
>>
>> So you join on the classroom_students table, and then do a group by 
>> classroom_id. However, you have another dataset of classrooms that that you 
>> want to exclude from the calculation, but you need the students from those 
>> classrooms
>>
>> The most direct way of thinking about this is to grab all the student IDs 
>> in those classrooms and exclude them so:
>>
>> >> exclude_students = 
>> exclude_classrooms_dataset.association_join(:classroom_students).select(:student_id).distinct
>>
>> or more cleaner:
>>
>> >> exclude_students = exclude_classrooms_dataset.student_pks_dataset 
>> (which automatically distinct and get it off the join table)
>>
>> Now you can return the exclude_students count with exclude_students.count 
>> (since it's already distinct). You could also do:
>>
>> classroom_dataset.association_join(:classroom_students).exclude(student_id: 
>> exclude_students).group(Sequel[:classrooms][:id])
>>
>
> I'm assuming you have:
>
>   Classroom.many_to_many :students
>   Student.many_to_many :classrooms
>   classroom_datasets = Classroom.dataset
>   exclude_classroom_dataset = Classroom.where(:id=>1..100)
>   student_dataset = Student.dataset
>
> Then you can use association filters:
>  
>   
> classroom_dataset.exclude(:students=>students_dataset.where(:classrooms=>exclude_classroom_dataset))
>
> Are there cases where you think association_pks dataset methods would be 
> needed that aren't covered by association filters?
>
> Thanks,
> Jeremy
>

-- 
You received this message because you are subscribed to the Google Groups 
"sequel-talk" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/sequel-talk/81a17eeb-7ada-4e34-9aad-a575fd5a228c%40googlegroups.com.

Reply via email to