Mark Blythe wrote: > This is slightly off-topic, but since I'm running into this problem > while using Catalyst, I'm hoping that others on the list may have > already solved it. > > I was writing a simple template today, using TT + DBIC. I had an > object and was exercising a has_many relationship. I simply wanted to > see if any rows had been returned. It seemed simple enough: > > [% SET children = parent.children %] > [% IF children.list.size %] > ... > [% END %] > > Well, it turns out that the size will always be >= 1, because TT can't > seem to handle an empty list. If the method called (parent.children) > returns an empty list, TT will substitute the return value with an > empty string: '''. > > I tried to think of a general idiom to check for a non-empty list > being returned: > > [% IF children.defined %] # no, because the empty string is defined > [% IF children %] # breaks if you return a single-element list with a > zero: ( 0 ) > [% IF children != '' %] # breaks if you return a single-element list > with an empty string: ( '' ) > > Of those three, the last one seems to be the least-common valid use > case, so I'm thinking I'll use that. It's painfully stupid looking, > so I may hide it (actually, the reverse) in an "is_empty" vmethod. > > I know I can get around this specific DBIx use case by using a > resultset instead. However, I just know this will bite me again under > other circumstances, and I want to have a workable solution for > dealing with empty lists under TT. > > Has anybody solved this reasonably well? Am I missing something basic?
Under DBIC 07+ you should find you have a children_rs method that returns a resultset even when called in list context (as TT does for everything). Then you could just call count on the rs ... _______________________________________________ List: [email protected] Listinfo: http://lists.rawmode.org/mailman/listinfo/catalyst Searchable archive: http://www.mail-archive.com/[email protected]/ Dev site: http://dev.catalyst.perl.org/
