Got it. Thanks all. Pretty different compared to rails2 for sure! Another good related summary is here:
http://asciicasts.com/episodes/202-active-record-queries-in-rails-3 -glenn On Mon, Jul 18, 2011 at 6:53 PM, Ben Wanicur <[email protected]> wrote: > +1 on James' comment. This snippet (from a Rails 3 console) might clear > things up a bit: > ruby-1.9.2-p0 > users = User.where('id > 0') > ruby-1.9.2-p0 > users.class > => ActiveRecord::Relation > > You can directly get to the collection by calling the all (or first, last -- > any method that returns an object or collection directly) method directly > from the model: > ruby-1.9.2-p0 > collection = User.all > ruby-1.9.2-p0 > collection.class > => Array > > With an ActiveRelation object (users), the SQL will not be execute until we > call an ActiveRecord method on the ActiveRelation object or iterate over > it... > ruby-1.9.2-p0 > collection = users.all > ruby-1.9.2-p0 > collection.class > => Array > ruby-1.9.2-p0 > users.each{|u| puts u.class} > User > User > ** When the ActiveRelation object is iterated over, it will actually execute > the SQL and fetch the object(s).... > > > As mentioned, you can also build upon the ActiveRelation object: > ruby-1.9.2-p0 > refined_users = users.where("id < 4") > ruby-1.9.2-p0 > refined_users.class > => ActiveRecord::Relation **Still an ActiveRelation object! > You obviously cannot do that to an array collection! > > Rails gives you the choice. Hope that clears it up a little bit! This > screencast does a pretty good walk-thorugh: > http://asciicasts.com/episodes/239-activerecord-relation-walkthrough > Cheers > Ben > > On Mon, Jul 18, 2011 at 5:45 PM, James Miller <[email protected]> wrote: >> >> @highschools = HighSchool.scoped will give you the lazy loading equivalent >> of .all with the added benefit that you can build on it later. The query >> will be executed at the last possible moment -- usually when you begin >> iterating over the collection. >> James >> >> On Mon, Jul 18, 2011 at 5:39 PM, Glenn Little <[email protected]> wrote: >>> >>> Ah, okay, I see. That was a subtle one! .all and .first are actually >>> fundamentally different from .where(). But it appears natural to use >>> them kind of interchangeably, just depending whether or not you happen >>> to have some conditions, e.g., in a controller setting up for a view: >>> >>> @highschools = HighSchool.all >>> @universities = University.where("some condition") >>> >>> Those variables are *not* of the same class. >>> >>> Is there a rule of thumb to make this not annoying? I would have >>> thought "just use .where() for consistency", but that leads to the >>> where(["1=1"]) sort of hackishness, unless I'm missing something? >>> >>> -glenn >>> >>> On Mon, Jul 18, 2011 at 5:19 PM, Guyren Howe <[email protected]> wrote: >>> > >>> > ActiveRecord in Rails 3 tries to be lazy. So you can queue up all kinds >>> > of modifiers to your query separately, and then execute them all together >>> > when you’re ready. .all is one way to trigger the actual query happening, >>> > and thus the conversion of a lazy query object into a result set. >>> > >>> > -- >>> > SD Ruby mailing list >>> > [email protected] >>> > http://groups.google.com/group/sdruby >>> > >>> >>> -- >>> SD Ruby mailing list >>> [email protected] >>> http://groups.google.com/group/sdruby >> >> -- >> SD Ruby mailing list >> [email protected] >> http://groups.google.com/group/sdruby > > -- > SD Ruby mailing list > [email protected] > http://groups.google.com/group/sdruby -- SD Ruby mailing list [email protected] http://groups.google.com/group/sdruby
