I think Rafael has already answered your questions, but as the person who made the changes I'm happy to answer any further questions if you have them?
On 27/02/13 13:31, Rafael Mendonça França wrote: > I did some review in the code and in a relation, `#load` checks for > `loaded?` so if the relation is still loaded it will not do the query. > The only way right now to reload a relation is using `#reload`. > > > Rafael Mendonça França > http://twitter.com/rafaelfranca > https://github.com/rafaelfranca > > > On Wed, Feb 27, 2013 at 10:13 AM, Rafael Mendonça França > <[email protected] <mailto:[email protected]>> wrote: > > 1. > > You are using the wrong method. If you want the query always you > call it you should use |#load| > > 2. > > Using |#load| you will know exactly when the query is done > > 3. > > |#sum| with block is not recommended since it will load all the > object in memory. This is why it was deprecated. > > The query method is there. It is called |#load| now. > > > Rafael Mendonça França > http://twitter.com/rafaelfranca > https://github.com/rafaelfranca > > > On Wed, Feb 27, 2013 at 6:42 AM, Will Bryant <[email protected] > <mailto:[email protected]>> wrote: > > Hi guys, > > I don't think that the changes made to the behavior of #all in > 4.0 are a very good idea. > > I can see that you no longer need to call all in as many cases > as you did before - that's fine, just don't call it if you don't > want it. But that doesn't mean you never need it or that people > who do need it should not have it available. > > 1. Yes you can use to_a in many cases, but it behaves > differently - for example if you have an association, to_a will > return the cached target if the association has already been > loaded. You absolutely need a way to run an actual query when > you want the latest results. to_a cannot be relied upon to do > this in all cases. > > Note lack of a second query: > > irb(main):006:0> p = Project.first > Project Load (0.2ms) SELECT "projects".* FROM "projects" > ORDER BY "projects"."id" ASC LIMIT 1 > => #<Project id: 1, created_at: "2013-02-27 09:38:49", > updated_at: "2013-02-27 09:38:49"> > irb(main):007:0> p.tasks.to_a > Task Load (0.2ms) SELECT "tasks".* FROM "tasks" WHERE > "tasks"."project_id" = ? [["project_id", 1]] > => [#<Task id: 1, project_id: 1, created_at: "2013-02-27 > 09:38:52", updated_at: "2013-02-27 09:38:52">, #<Task id: 2, > project_id: 1, created_at: "2013-02-27 09:38:53", updated_at: > "2013-02-27 09:38:53">] > irb(main):008:0> p.tasks.to_a > => [#<Task id: 1, project_id: 1, created_at: "2013-02-27 > 09:38:52", updated_at: "2013-02-27 09:38:52">, #<Task id: 2, > project_id: 1, created_at: "2013-02-27 09:38:53", updated_at: > "2013-02-27 09:38:53">] > irb(main):010:0> p.tasks.all > DEPRECATION WARNING: Relation#all is deprecated. If you want to > eager-load a relation, you can call #load (e.g. > `Post.where(published: true).load`). If you want to get an array > of records from a relation, you can call #to_a (e.g. > `Post.where(published: true).to_a`). (called from irb_binding at > (irb):10) > => [#<Task id: 1, project_id: 1, created_at: "2013-02-27 > 09:38:52", updated_at: "2013-02-27 09:38:52">, #<Task id: 2, > project_id: 1, created_at: "2013-02-27 09:38:53", updated_at: > "2013-02-27 09:38:53">] > irb(main):011:0> p.tasks.all > DEPRECATION WARNING: Relation#all is deprecated. If you want to > eager-load a relation, you can call #load (e.g. > `Post.where(published: true).load`). If you want to get an array > of records from a relation, you can call #to_a (e.g. > `Post.where(published: true).to_a`). (called from irb_binding at > (irb):11) > => [#<Task id: 1, project_id: 1, created_at: "2013-02-27 > 09:38:52", updated_at: "2013-02-27 09:38:52">, #<Task id: 2, > project_id: 1, created_at: "2013-02-27 09:38:53", updated_at: > "2013-02-27 09:38:53">] > > 2. It's very important that queries run at the point you think > they do in any application that uses locks or concurrency. > Again, if you don't use locks or concurrency, fine - don't call > the query methods. But many people do and they need to be able > to run the queries to make this work. > > 3. It's not true that you no longer need to care whether you > have an array or a relation. For example, methods like sum with > a block need arrays, as the deprecation makes clear: > > irb(main):009:0> p.tasks.sum(&:id) > DEPRECATION WARNING: Calling #sum with a block is deprecated and > will be removed in Rails 4.1. If you want to perform sum > calculation over the array of elements, use `to_a.sum(&block)`. > (called from irb_binding at (irb):9) > Task Load (0.1ms) SELECT "tasks".* FROM "tasks" WHERE > "tasks"."project_id" = ? [["project_id", 1]] > => 3 > > 4. It's true that making all basically useless means you can now > call all on a model class itself and get a relation and then you > can merge that or whatever, which was one of the other examples > in the changelog. But you could do that already - using scoped. > It is not necessary to break #all's behavior to get this > functionality. > > Have I misunderstood the change? > > If not, can we please put back the query method? Running > queries is a pretty core responsibility of ActiveRecord. > > Thanks, > Will > > -- > You received this message because you are subscribed to the > Google Groups "Ruby on Rails: Core" group. > To unsubscribe from this group and stop receiving emails from > it, send an email to > [email protected] > <mailto:rubyonrails-core%[email protected]>. > To post to this group, send email to > [email protected] > <mailto:[email protected]>. > Visit this group at > http://groups.google.com/group/rubyonrails-core?hl=en. > For more options, visit https://groups.google.com/groups/opt_out. > > > > > -- > You received this message because you are subscribed to the Google > Groups "Ruby on Rails: Core" group. > To unsubscribe from this group and stop receiving emails from it, send > an email to [email protected]. > To post to this group, send email to [email protected]. > Visit this group at http://groups.google.com/group/rubyonrails-core?hl=en. > For more options, visit https://groups.google.com/groups/opt_out. > > -- You received this message because you are subscribed to the Google Groups "Ruby on Rails: Core" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. To post to this group, send email to [email protected]. Visit this group at http://groups.google.com/group/rubyonrails-core?hl=en. For more options, visit https://groups.google.com/groups/opt_out.
