Joins in ActiveRecord#find and least principle surprise

View: New views
5 Messages — Rating Filter:   Alert me  

Joins in ActiveRecord#find and least principle surprise

by Rodrigo Rosenfeld Rosas-3 :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message


Frequently I lose some time trying to figure out why my tests are
failing when I use joins in ActiveRecord#find.

The logic seems fine, but the tests still fail. Than I remember that I
should convert the integer properties from columns of other join tables
from string to integer:

assert Model.find(:first, :select => 'models.*, other_table.integer_column',
   :joins => 'left join other_table on
other_table.model_id=models.id').integer_column*.to_i* == 1

What are the reasons that the column types are not the expected ones?
Would it be complicated to implement or would it lose performance or
just no one cared about this yet?

Thanks in advance,

Rodrigo.


--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups "Ruby on Rails: Core" group.
To post to this group, send email to rubyonrails-core@...
To unsubscribe from this group, send email to rubyonrails-core+unsubscribe@...
For more options, visit this group at http://groups.google.com/group/rubyonrails-core?hl=en
-~----------~----~----~----~------~----~------~--~---


Re: Joins in ActiveRecord#find and least principle surprise

by Michael Koziarski :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message


> What are the reasons that the column types are not the expected ones?
> Would it be complicated to implement or would it lose performance or
> just no one cared about this yet?

It's the same with this case:

Foo.find(:select=> "*, SUM(something) as SomeFakeAttribute")

We don't know the type of those values, and have no reliable way to
figure them out.  In the event that the database driver itself does
typecasting (and some of them do) you'll get the right types
automatically.

So it's not a performance thing, we just don't have enough information
to reliably do the typecasting.  The place that does is the database
driver, and that's the place where you'd need to send a patch.


--
Cheers

Koz

--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups "Ruby on Rails: Core" group.
To post to this group, send email to rubyonrails-core@...
To unsubscribe from this group, send email to rubyonrails-core+unsubscribe@...
For more options, visit this group at http://groups.google.com/group/rubyonrails-core?hl=en
-~----------~----~----~----~------~----~------~--~---


Re: Joins in ActiveRecord#find and least principle surprise

by Jeremy Evans :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message


On Mon, Nov 2, 2009 at 7:46 PM, Michael Koziarski <michael@...> wrote:

>
>> What are the reasons that the column types are not the expected ones?
>> Would it be complicated to implement or would it lose performance or
>> just no one cared about this yet?
>
> It's the same with this case:
>
> Foo.find(:select=> "*, SUM(something) as SomeFakeAttribute")
>
> We don't know the type of those values, and have no reliable way to
> figure them out.  In the event that the database driver itself does
> typecasting (and some of them do) you'll get the right types
> automatically.
>
> So it's not a performance thing, we just don't have enough information
> to reliably do the typecasting.  The place that does is the database
> driver, and that's the place where you'd need to send a patch.

For ruby-mysql and all three ruby postgres drivers (pg, postgres, and
postgres-pr), the driver itself returns column values as strings, but
it also gives you column type information that you can use to typecast
those strings.  Sequel uses that column type information to typecast
such values correctly.  See
http://github.com/jeremyevans/sequel/blob/master/lib/sequel/adapters/postgres.rb#L95
and http://github.com/jeremyevans/sequel/blob/master/lib/sequel/adapters/mysql.rb#L26
for an examples of conversion procs used based on the column type
number.

I'm not saying ActiveRecord should take that approach, I'm just saying
the information is there, at least for those drivers.

Jeremy

--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups "Ruby on Rails: Core" group.
To post to this group, send email to rubyonrails-core@...
To unsubscribe from this group, send email to rubyonrails-core+unsubscribe@...
For more options, visit this group at http://groups.google.com/group/rubyonrails-core?hl=en
-~----------~----~----~----~------~----~------~--~---


Re: Joins in ActiveRecord#find and least principle surprise

by Michael Koziarski :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message


> For ruby-mysql and all three ruby postgres drivers (pg, postgres, and
> postgres-pr), the driver itself returns column values as strings, but
> it also gives you column type information that you can use to typecast
> those strings.  Sequel uses that column type information to typecast
> such values correctly.  See
> http://github.com/jeremyevans/sequel/blob/master/lib/sequel/adapters/postgres.rb#L95
> and http://github.com/jeremyevans/sequel/blob/master/lib/sequel/adapters/mysql.rb#L26
> for an examples of conversion procs used based on the column type
> number.
>
> I'm not saying ActiveRecord should take that approach, I'm just saying
> the information is there, at least for those drivers.

I stand corrected!

I believe the oracle / mssql drivers do this typecasting interally and
that still feels cleaner, however if someone wanted to take a look at
that logic and pull it into the postgres / mysql adapters we can see
what breaks / doesn't.


--
Cheers

Koz

--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups "Ruby on Rails: Core" group.
To post to this group, send email to rubyonrails-core@...
To unsubscribe from this group, send email to rubyonrails-core+unsubscribe@...
For more options, visit this group at http://groups.google.com/group/rubyonrails-core?hl=en
-~----------~----~----~----~------~----~------~--~---


Re: Joins in ActiveRecord#find and least principle surprise

by Rodrigo Rosenfeld Rosas-3 :: Rate this Message:

Reply to Author | View Threaded | Show Only this Message


Em 03-11-2009 04:41, Michael Koziarski escreveu:

>> For ruby-mysql and all three ruby postgres drivers (pg, postgres, and
>> postgres-pr), the driver itself returns column values as strings, but
>> it also gives you column type information that you can use to typecast
>> those strings.  Sequel uses that column type information to typecast
>> such values correctly.  See
>> http://github.com/jeremyevans/sequel/blob/master/lib/sequel/adapters/postgres.rb#L95
>> and http://github.com/jeremyevans/sequel/blob/master/lib/sequel/adapters/mysql.rb#L26
>> for an examples of conversion procs used based on the column type
>> number.
>>
>> I'm not saying ActiveRecord should take that approach, I'm just saying
>> the information is there, at least for those drivers.
>>      
>
> I stand corrected!
>
> I believe the oracle / mssql drivers do this typecasting interally and
> that still feels cleaner, however if someone wanted to take a look at
> that logic and pull it into the postgres / mysql adapters we can see
> what breaks / doesn't.
>
>
>    
It happens that at this moment I'm very late on a project, but as soon I
finish it (in about 3 months), I'll take a look again on this subject.

There is already another patch I would like to send that I am
postponning: allow a further option ':full_message' in validations. It
will also have to wait...

But at least now I know there is no problem in submitting such patch.

Thank you,

Rodrigo.


--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups "Ruby on Rails: Core" group.
To post to this group, send email to rubyonrails-core@...
To unsubscribe from this group, send email to rubyonrails-core+unsubscribe@...
For more options, visit this group at http://groups.google.com/group/rubyonrails-core?hl=en
-~----------~----~----~----~------~----~------~--~---