I see.  I was not clear that a change _had_ been made, which was to change

case joins_for_collection.class

to

case joins_for_collection

Thanks for staying with me on it.

Wes

Sergio Cambra .:: entreCables - Symbol Servicios Informáticos S.L. ::. 
wrote:
> El Tuesday 31 March 2009 16:18:16 Wes Gamble escribió:
>   
>> The issue has to do with the fact that String === String returns false
>> and so does Array === Array.
>>
>> The usage of .class below is in a bogus debug puts and doesn't have
>> anything to do with the case statement anyway.
>>
>> If the final fix was to leave the case statement comparing classes, then
>> it still won't work.
>>     
>
> It works. Try in irb:
> def check_case(value)
>   case value
>     when String
>       puts 'string'
>     when Array
>       puts 'array'
>     else
>       puts 'else'
>   end
> end
> check_case ''
> check_case []
>
>   
>> Wes
>>
>> Mukund wrote:
>>     
>>> The issue has to do with the case statement and the overloaded ===
>>> operator.  If you want to query the class for an object, don't use
>>> the .class operator on the case statement.
>>>
>>> case joins_for_collection
>>>       when String
>>>         [ joins_for_collection ]
>>>       when Array
>>>         puts joins_for_collection.inspect
>>>         joins_for_collection
>>>       else
>>>         puts "HERE: #{joins_for_collection.class}"
>>>         []
>>>       end + active_scaffold_habtm_joins
>>>
>>> works without the .class.  That is how the final fix was made as
>>> well.  Just a Ruby annoyance. :)
>>>
>>>
>>> On Mar 26, 1:42 pm, "Sergio Cambra .:: entreCables - Symbol Servicios
>>>
>>> Informáticos S.L. ::." <[email protected]> wrote:
>>>       
>>>> El Wednesday 25 March 2009 18:56:50 Wes Gamble escribió:
>>>>         
>>>>> Wes Gamble wrote:
>>>>>           
>>>>>> Wes Gamble wrote:
>>>>>>             
>>>>>>> Sergio Cambra .:: entreCables - Symbol Servicios Informáticos S.L.
>>>>>>> ::.
>>>>>>>
>>>>>>> wrote:
>>>>>>>               
>>>>>>>> El Wednesday 25 March 2009 15:33:14 Wes Gamble escribió:
>>>>>>>>                 
>>>>>>>>> Sergio Cambra .:: entreCables - Symbol Servicios Informáticos S.L.
>>>>>>>>> ::.
>>>>>>>>>
>>>>>>>>> wrote:
>>>>>>>>>                   
>>>>>>>>>> El Sunday 22 March 2009 08:17:18 Wes Gamble escribió:
>>>>>>>>>>
>>>>>>>>>> I have a fairly complex custom find call that I need to do in some
>>>>>>>>>> instances for an AS index view.  conditions_for_collection will
>>>>>>>>>> only handle conditions, correct?  Is there any hook so that I can
>>>>>>>>>> provide other find options like :joins or :limit?
>>>>>>>>>>
>>>>>>>>>> You can define an active_scaffold_joins method, like
>>>>>>>>>> active_scaffold_conditions, and you can set the limit in your
>>>>>>>>>> controller AS config:
>>>>>>>>>> config.list.per_page
>>>>>>>>>> http://wiki.github.com/activescaffold/active_scaffold/api-list
>>>>>>>>>>                     
>>>>>>>>> Sergio,
>>>>>>>>>
>>>>>>>>> I need to do a join to a HABTM association table - currently I'm
>>>>>>>>> doing it as a subquery via conditions_for_collection, as in:
>>>>>>>>>
>>>>>>>>> "id IN (SELECT medical_facility_id FROM
>>>>>>>>> medical_facilities_medical_facility_categories WHERE
>>>>>>>>> medical_facility_category_id = #...@medical_facility_category_id})"
>>>>>>>>> if @medical_facility_category_id
>>>>>>>>>
>>>>>>>>> How would I write the active_scaffold_joins (or looks like I should
>>>>>>>>> use active_scaffold_habtm_joins) to handle this case?
>>>>>>>>>                   
>>>>>>>> Sorry, I was wrong.
>>>>>>>> conditions_for_collection is for set :conditions option of rails
>>>>>>>> find. joins_for_collection is for set :joins option of
>>>>>>>> ActiveRecord's find method.
>>>>>>>>
>>>>>>>> Do you know build the sql with ActiveRecord's find method?
>>>>>>>> MedicalFacility.find :all, :joins => :medical_facility_categories,
>>>>>>>>
>>>>>>>> :conditions => ['medical_facility_categories.id = ?',
>>>>>>>>
>>>>>>>> @medical_facility_category_id]
>>>>>>>>
>>>>>>>> So you define these methods:
>>>>>>>> def conditions_for_collection
>>>>>>>>   ['medical_facility_categories.id = ?',
>>>>>>>> @medical_facility_category_id] end
>>>>>>>>
>>>>>>>> def joins_for_collection
>>>>>>>>   [:medical_facility_categories]
>>>>>>>> end
>>>>>>>>                 
>>>>>>> This is weird.  The call to "joins_for_finder" (which calls
>>>>>>> joins_for_collection) is failing.  I've puts'ed it to death to see
>>>>>>> what's happening.  Even though the class of my "joins_for_collection"
>>>>>>> method is reported as Array, Array is NOT matching on the case
>>>>>>> statement, and it is dropping into the else. WTF?
>>>>>>>
>>>>>>> def joins_for_finder
>>>>>>>       puts joins_for_collection.class
>>>>>>>
>>>>>>>       case joins_for_collection.class
>>>>>>>       when String
>>>>>>>         [ joins_for_collection ]
>>>>>>>       when Array
>>>>>>>         puts joins_for_collection.inspect
>>>>>>>         joins_for_collection
>>>>>>>       else
>>>>>>>         puts "HERE: #{joins_for_collection.class}"
>>>>>>>         []
>>>>>>>       end + active_scaffold_habtm_joins
>>>>>>>     end
>>>>>>>
>>>>>>> Output:
>>>>>>> Array
>>>>>>> HERE: Array
>>>>>>>               
>>>>>> Sure enough, joins_for_collection.class === Array returns false,
>>>>>> although joins_for_collection.class == Array returns true.
>>>>>>
>>>>>> This looks like a bug to me, and now I wonder if joins_for_collection
>>>>>> ever worked.  Same behavior occurs if a String is returned from
>>>>>> joins_for_collection.
>>>>>>             
>>>>> This works:
>>>>>
>>>>>    def joins_for_finder
>>>>>       case joins_for_collection.class.to_s
>>>>>       when 'String'
>>>>>         [ joins_for_collection ]
>>>>>       when 'Array'
>>>>>         joins_for_collection
>>>>>       else
>>>>>         []
>>>>>       end + active_scaffold_habtm_joins
>>>>>     end
>>>>>
>>>>> It makes sense that the "===" doesn't work between classes since it is
>>>>> defined thusly:
>>>>>
>>>>> "Ruby classes are instances of class Class, which defines === to test
>>>>> if the argument
>>>>> is an instance of the class or one of its superclasses."
>>>>>
>>>>> Since a class is not an instance of anything, === will never work in
>>>>> this case.
>>>>>
>>>>> I'm on the 2.1 branch - maybe this has been fixed in edge AS?
>>>>>           
>>>> Fixed in rails 2.1, 2.2 and edge
>>>>
>>>> --
>>>> Sergio Cambra .:: entreCables S.L. ::.
>>>> Nicolás Guillén 6, locales 2 y 3. 50.018 Zaragoza
>>>> T) 902 021 404 F) 976 52 98 07 E) [email protected]
>>>>         
>>     
>
>
>   

--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups 
"ActiveScaffold : Ruby on Rails plugin" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to 
[email protected]
For more options, visit this group at 
http://groups.google.com/group/activescaffold?hl=en
-~----------~----~----~----~------~----~------~--~---

  • Re... Sergio Cambra .:: entreCables - Symbol Servicios Informáticos S.L. ::.
    • ... Wes Gamble
      • ... Sergio Cambra .:: entreCables - Symbol Servicios Informáticos S.L. ::.
        • ... Wes Gamble
          • ... Wes Gamble
            • ... Wes Gamble
              • ... Sergio Cambra .:: entreCables - Symbol Servicios Informáticos S.L. ::.
              • ... Mukund
              • ... Wes Gamble
              • ... Sergio Cambra .:: entreCables - Symbol Servicios Informáticos S.L. ::.
              • ... Wes Gamble
      • ... rbarton

Reply via email to