On 27/02/13 20:01, Will Bryant wrote: > Hi Jon, > > Unfortunately as per Matt and Rafael's second reply, there is no method that > *always* runs a query, whether you have an association or a relation. We > still need that.
#reload will always run the query. If I'm misunderstanding the use case please provide some examples. > > Cheers, > Will > > > On 28/02/2013, at 07:36 , Jon Leighton <[email protected]> wrote: > >> 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. >> >> > -- 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.
