[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

Inserting surrounding scope into singelton method definition

Sebastia

12/11/2006 11:51:00 PM

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)

4 Answers

dblack

12/12/2006 12:03:00 AM

0

Sebastia

12/12/2006 12:49:00 AM

0

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, dblack@wobblini.net said:

> Hi --
>
> On Tue, 12 Dec 2006, Sebastia wrote:
>
>> 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)
>
> 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


dblack

12/12/2006 1:14:00 AM

0

Ara.T.Howard

12/12/2006 2:22:00 AM

0