I have a sorted array (in this case, an ActiveRecord result set) that i

want to give awareness of its sorting state. I defined a singelton

method on the array but i can’t figure out how to insert a value from

the surrounding scope. Below is the best i could come up with, but it

seems quite horrid (and using plain eval would be even worse i

suppose). I seem to remember that there was a better way… Anybody?

Thanks,

Sebastian

sort_term = “label”

results = User.find(:all, :order => sort_term)

class << results

def sorted_by?

@sorted_by_term

end

end

results.instance_variable_set("@sorted_by_term",sort_term)

Hi –

On Tue, 12 Dec 2006, Sebastia wrote:

sort_term = “label”

results = User.find(:all, :order => sort_term)

class << results

def sorted_by?

@sorted_by_term

end

end

results.instance_variable_set("@sorted_by_term",sort_term)

To get through the barrier of the class and def scopes, you can use

class_eval and define_method:

(class << results; self; end).class_eval do

define_method(:sorted_by?, sort_term)

end

or something along those lines.

David

Wonderful! For some reason the 2-argument notation in your example

didn’t work for me, but with a Proc as the method definition body all

is dandy. I had tried class_eval before but ignorantly used it on the

array instance instead, which of course doesnt work. So, thanks very

much for your help.

Here’s the final code:

returning find(:all, :order => “#{sort_by_term} #{sort_order_term}”) do

|results|

(class << results; self; end).class_eval do

define_method(:sorted_by?) { sort_by_term }

define_method(:sort_order?) { sort_order_term }

end

end

On 2006-12-11 18:02:34 -0600, [email protected] said:

Hi –

On Tue, 12 Dec 2006, Sebastian wrote:

Wonderful! For some reason the 2-argument notation in your example didn’t

work for me, but with a Proc as the method definition body all is dandy. I

had tried class_eval before but ignorantly used it on the array instance

instead, which of course doesnt work. So, thanks very much for your help.

Yes, I used the wrong construct – I’m glad you figured it out

David

On Tue, 12 Dec 2006, Sebastia wrote:

sort_term = “label”

results = User.find(:all, :order => sort_term)

class << results

def sorted_by?

@sorted_by_term

end

end

results.instance_variable_set("@sorted_by_term",sort_term)

why not just use an attr

results = User.find :all, :order => sort_term

class << results

attr_accessor ‘sorted_by’

alias_method ‘sorted_by?’, ‘sorted_by’

end

results.sorted_by = “label”

othewise you need to use module_eval and define_method due to the

scoping.

-a