On Wednesday, July 4, 2012 4:12:42 PM UTC-7, Rodrigo Rosenfeld Rosas wrote:
>
> Em 04-07-2012 19:49, Jeremy Evans escreveu:
>
> On Wednesday, July 4, 2012 2:39:11 PM UTC-7, Rodrigo Rosenfeld Rosas
> wrote:
>>
>> There is a critical part in my application where I need to generate the
>> SQL by myself.
>>
>> It would be easier to process the results of this generated dynamic SQL
>> if I could iterate over each row by index.
>>
>> I mean, instead of having DB[sql].all to return something like [{tid:
>> 23, tname: 'Some name'}, ...] I'd prefer to get something like: [[23, "Some
>> name"], [...], ...].
>>
>> Currently I'm doing something like below, but I'd like to know if there
>> is some method that already does that and that I'm not aware of:
>>
>> builder = QueryBuilder.new(params)
>> json = DB[builder.sql].map do |r|
>> r = r.map{|k, v| v} # this is the trick I'm currently using
>> builder.columns.map do |c|
>> raw = r.shift
>> case c[:type]
>> when 'range' then [raw, r.shift]
>> ...
>> else raw
>> end
>> end
>>
>>
> You can provide an argument to map:
>
> ds = DB[builder.sql]
> ds.map(ds.columns)
>
>
> Thanks for your support once more, Jeremy.
>
> The problem is that my columns array doesn't contain the alias
> information. It is something like [{field_id: 687, type: 'string'},
> {field_id: 934, type: 'time-span'}, ...]. Even though all my columns are
> aliased in the generated query, they shouldn't be. I don't rely on their
> alias for anything but readability. It wouldn't be hard to include the
> alias in the columns array but it wouldn't be trivial either. And I'd need
> to add more complexity and tests to my QueryBuilder just to work around a
> Sequel limitation.
>
ds.columns should should an array of the correct alias symbols (did you try
it?). If you do DB['SELECT 1 AS a, 2 as b'].columns you should get [:a,
:b].
Note that Dataset#columns may require a query if it call it before getting
results from the dataset. You might want to keep your current code and do
this instead of r.map:
r = r.values_at(*ds.columns)
That way you aren't relying on a specific order in the hash.
> Your current code (r = r.map{|k, v| v}) is not guaranteed to be portable
> across adapters (as adapters make no guarantee that hash entry order is the
> same as column order), and certainly is unlikely to work on ruby 1.8
> because hashes aren't ordered there.
>
>
> Yeah, I was aware of that. I'm not worried about 1.8 because I don't use
> it for several years now. But I wasn't aware that some adapters wouldn't
> fill the hash in the same order of the columns though.
>
Well, most of them probably do, since that's the simplest way in most
cases. However, I wouldn't write code that relies on it.
Jeremy
>
--
You received this message because you are subscribed to the Google Groups
"sequel-talk" group.
To view this discussion on the web visit
https://groups.google.com/d/msg/sequel-talk/-/H_BURCA8dEAJ.
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/sequel-talk?hl=en.