I’m trying to set a specific order to an association, but I keep getting the default scope order definition.
What am I missing?
class Pattern < ActiveRecord::Base
default_scope { order(‘sort, title’) }
has_and_belongs_to_many :children,
:class_name => 'Pattern',
:join_table => 'patterns_patterns',
:association_foreign_key => 'child_id',
:foreign_key => 'parent_id',
:order => 'patterns_patterns.updated_at'
end
SELECT “patterns”.* FROM “patterns” INNER JOIN “patterns_patterns” ON “patterns”.“id” = “patterns_patterns”.“child_id” WHERE “patterns_patterns”.“parent_id” = ? ORDER BY sort, title [[“parent_id”, 1]]
I tend to avoid default_scope for exactly this reason, the results are
not always obvious. I prefer to use named scopes or specify the order
explicitly. Then you have better control of what is going on. Many
believe default scopes are evil. I believe you can override it using
reorder.
Colin
Which Rails version are you running? There were a substantial number of issues with default_scope fixed in 4.0 and 4.1.
–Matt Jones
Hi Colin, thank you for your answer.
I just realized that my problem is bigger than that. I removed the default_scope and my query now is “orderbyless”.
SELECT “patterns”.* FROM “patterns” INNER JOIN “patterns_patterns” ON “patterns”.“id” = “patterns_patterns”.“child_id” WHERE “patterns_patterns”.“parent_id” = ? [[“parent_id”, 7]]
Why the order is been ignored?
class Pattern < ActiveRecord::Base
has_and_belongs_to_many :children,
:class_name => 'Pattern',
:join_table => 'patterns_patterns',
:association_foreign_key => 'child_id',
:foreign_key => 'parent_id',
:order => 'patterns_patterns.updated_at'
end
Quinta-feira, 15 de Maio de 2014 5:34:26 UTC-3, Colin Law escreveu:
Hi Matt,
My Rails version is 4.1.0.
Quinta-feira, 15 de Maio de 2014 10:11:01 UTC-3, Matt Jones escreveu:
Hi Colin, thank you for your answer.
I just realized that my problem is bigger than that. I removed the default_scope and my query now is “orderbyless”.
SELECT “patterns”.* FROM “patterns” INNER JOIN “patterns_patterns” ON “patterns”.“id” = “patterns_patterns”.“child_id” WHERE “patterns_patterns”.“parent_id” = ? [[“parent_id”, 7]]
Why the order is been ignored?
class Pattern < ActiveRecord::Base
has_and_belongs_to_many :children,
:class_name => 'Pattern',
:join_table => 'patterns_patterns',
:association_foreign_key => 'child_id',
:foreign_key => 'parent_id',
:order => 'patterns_patterns.updated_at'
end
The order
option was removed a while back - things that change the query should be done in a scope lambda instead:
has_and_belongs_to_many :children, → { order(:something) }, …
–Matt Jones
Thank you Matt,
It kind for work. It added a new order item instead of replace it.
class Pattern < ActiveRecord::Base
default_scope { order(‘sort, title’) }
has_and_belongs_to_many :children,
-> { order('patterns_patterns.id') },
:class_name => 'Pattern',
:join_table => 'patterns_patterns',
:association_foreign_key => 'child_id',
:foreign_key => 'parent_id'
end
**… ORDER BY sort, title, patterns_patterns.id **
Any idea?
Sexta-feira, 16 de Maio de 2014 9:27:18 UTC-3, Matt Jones escreveu:
Solved.
If anybody is having the same issue, the answer is to use “reorder” instead of order.
Thank you all.
Sexta-feira, 16 de Maio de 2014 19:38:15 UTC-3, Henrique Vilela escreveu:
I think that is what I said in my first reply.
Colin