Pluck and id give an array of non-unique elements

In the console:

Course.ids.count => 1766 Course.pluck(:id).count => 1766 Course.ids.uniq.count => 1529 Course.count => 1529 

This is normal?

small comment - The course model uses a pedigree (gem).

UPD1:

Generated sql:

 Learn::Course.ids.count (5.4ms) SELECT "learn_courses"."id" FROM "learn_courses" LEFT OUTER JOIN "learn_course_translations" ON "learn_course_translations"."learn_course_id" = "learn_courses"."id" => 1766 Learn::Course.count (1.5ms) SELECT COUNT(*) FROM "learn_courses" => 1529 

hmm ...

UPD2:

Schema Information

 # # Table name: learn_courses # # id :integer not null, primary key # name :string(255) # position :integer # created_at :datetime # updated_at :datetime # ancestry :string(255) # course_type :string(255) # article :string(255) # item_style :integer # hidden :boolean # score :integer default(0) # next_id :integer # first :boolean 
+5
source share
2 answers

You should be able to get around this with

 Learn::Course.pluck('distinct learn_courses.id') 

The problem is that the LEFT OUTER JOIN with learn_course_translations , which must have multiple lines on the Learn::Course , resulting in the same learn_courses.id appearing several times. pluck doesn't care about distinctness, so it just passes them back.

+1
source

Maybe ancestry adds default_scope to your model. Try checking it with

 Learn::Course.unscoped.ids.count 
0
source

All Articles