Rails 4 has_and_belongs_to_many specific order

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]]

On 14 May 2014 19:13, Henrique V. [email protected] wrote:

I’m trying to set a specific order to an association, but I keep getting the
default scope order definition.

What am I missing?

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

On Wednesday, 14 May 2014 14:13:51 UTC-4, Henrique V. wrote:

: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]]

Which Rails version are you running? There were a substantial number of
issues with default_scope fixed in 4.0 and 4.1.

–Matt J.

Hi Matt,

My Rails version is 4.1.0.

Quinta-feira, 15 de Maio de 2014 10:11:01 UTC-3, Matt J. 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

Quinta-feira, 15 de Maio de 2014 5:34:26 UTC-3, Colin L. escreveu:

On Thursday, 15 May 2014 09:56:11 UTC-4, Henrique V. wrote:

: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 J.

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 J. 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 V.
escreveu:

On 17 May 2014 01:41, Henrique V. [email protected] wrote:

Solved.

If anybody is having the same issue, the answer is to use “reorder” instead
of order.

I think that is what I said in my first reply.

Colin

This forum is not affiliated to the Ruby language, Ruby on Rails framework, nor any Ruby applications discussed here.

| Privacy Policy | Terms of Service | Remote Ruby Jobs