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?
Wes
--~--~---------~--~----~------------~-------~--~----~
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
-~----------~----~----~----~------~----~------~--~---