Hey I'' m quite surprised by the behaviour of has_many associations on new_records, so might someone here tell me if I''m simply missing the point or is it a Bug? ruby 1.9.3p265 Rails 3.2.8 class Invoice < ActiveRecord::Base has_many :bikes, :dependent => :nullify end class Bike < ActiveRecord::Base belongs_to Invoice end now a bike does not necessarily belongs to any invoice, so a bike with invoice_id = nil is perfectly valid. If I now create a new Invoice and ask for its bikes, everything works as expected: ruby-1.9.3-head :001 > Invoice.new.bikes => [] To my surprise now: ruby-1.9.3-head :002 > Invoice.new.bikes.count (1.9ms) SELECT COUNT(*) FROM "bikes" WHERE "bikes"."invoice_id" IS NULL => 744 and even better (Bike has an attribute :price) ruby-1.9.3-head :003 > Invoice.new.bikes.sum(&:price) Bike Load (30.4ms) SELECT "bikes".* FROM "bikes" WHERE "bikes"."invoice_id" IS NULL => 809577.5 Well I see that the sql is perfectly logical, but nonetheless not very practical. Do I really have to do something ugly like class Invoice < ActiveRecord::Base has_many :bikes, :dependent => :nullify, :conditions => ''invoice_id IS NOT NULL'' end or do I simply miss the point? cheers robbytobby -- You received this message because you are subscribed to the Google Groups "Ruby on Rails: Core" group. To view this discussion on the web visit https://groups.google.com/d/msg/rubyonrails-core/-/kL11IVcm0DQJ. To post to this group, send email to rubyonrails-core@googlegroups.com. To unsubscribe from this group, send email to rubyonrails-core+unsubscribe@googlegroups.com. For more options, visit this group at http://groups.google.com/group/rubyonrails-core?hl=en.
It is a bug and we fixed it yesterday on master<https://github.com/rails/rails/pull/6978>. I''m backporting the fixes to 3-2-stable right now. Rafael Mendonça França http://twitter.com/rafaelfranca https://github.com/rafaelfranca On Thu, Oct 4, 2012 at 11:43 AM, robbytobby < widu@fahrradwerkstatt-freiburg.de> wrote:> Hey > > I'' m quite surprised by the behaviour of has_many associations on > new_records, so might someone here tell me if I''m simply missing the point > or is it a Bug? > > ruby 1.9.3p265 > Rails 3.2.8 > > class Invoice < ActiveRecord::Base > has_many :bikes, :dependent => :nullify > end > > class Bike < ActiveRecord::Base > belongs_to Invoice > end > > now a bike does not necessarily belongs to any invoice, so a bike with > invoice_id = nil is perfectly valid. > If I now create a new Invoice and ask for its bikes, everything works as > expected: > > ruby-1.9.3-head :001 > Invoice.new.bikes > => [] > > To my surprise now: > > ruby-1.9.3-head :002 > Invoice.new.bikes.count > (1.9ms) SELECT COUNT(*) FROM "bikes" WHERE "bikes"."invoice_id" IS NULL > => 744 > > and even better (Bike has an attribute :price) > > ruby-1.9.3-head :003 > Invoice.new.bikes.sum(&:price) > Bike Load (30.4ms) SELECT "bikes".* FROM "bikes" WHERE > "bikes"."invoice_id" IS NULL > => 809577.5 > > Well I see that the sql is perfectly logical, but nonetheless not very > practical. > Do I really have to do something ugly like > > class Invoice < ActiveRecord::Base > has_many :bikes, :dependent => :nullify, :conditions => ''invoice_id IS > NOT NULL'' > end > > or do I simply miss the point? > > cheers > robbytobby > > > > -- > You received this message because you are subscribed to the Google Groups > "Ruby on Rails: Core" group. > To view this discussion on the web visit > https://groups.google.com/d/msg/rubyonrails-core/-/kL11IVcm0DQJ. > To post to this group, send email to rubyonrails-core@googlegroups.com. > To unsubscribe from this group, send email to > rubyonrails-core+unsubscribe@googlegroups.com. > For more options, visit this group at > http://groups.google.com/group/rubyonrails-core?hl=en. >-- 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@googlegroups.com. To unsubscribe from this group, send email to rubyonrails-core+unsubscribe@googlegroups.com. For more options, visit this group at http://groups.google.com/group/rubyonrails-core?hl=en.
Thanks for your fast reply. I just checked out the 3-2-stable branch and
the count problem is fixed. However the sum issue
ruby-1.9.3-head :003 > Invoice.new.bikes.sum(&:price)
Bike Load (30.4ms) SELECT "bikes".* FROM "bikes" WHERE
"bikes"."invoice_id" IS NULL
=> 809577.5
still remains. But the same fix works for the sum method
activerecord/lib/active_record/associations/collection_association.rb
# Calculate sum using SQL, not Enumerable
def sum(*args)
return 0 if owner.new_record?
if block_given?
scoped.sum(*args) { |*block_args| yield(*block_args) }
else
scoped.sum(*args)
end
end
I do apologize for not making a pull request, but I don''t know how to
do
that propperly with test etc, and right now, I''ve got no nerve to read
a
howto on that topic.
Am 04.10.2012 18:27, schrieb Rafael Mendonça França:>
> It is a bug and we fixed it yesterday on master
> <https://github.com/rails/rails/pull/6978>. I''m backporting
the fixes
> to 3-2-stable right now.
>
>
> Rafael Mendonça França
> http://twitter.com/rafaelfranca
> https://github.com/rafaelfranca
>
>
>
> On Thu, Oct 4, 2012 at 11:43 AM, robbytobby
> <widu@fahrradwerkstatt-freiburg.de
> <mailto:widu@fahrradwerkstatt-freiburg.de>> wrote:
>
> Hey
>
> I'' m quite surprised by the behaviour of has_many associations
on
> new_records, so might someone here tell me if I''m simply
missing
> the point or is it a Bug?
>
> ruby 1.9.3p265
> Rails 3.2.8
>
> class Invoice < ActiveRecord::Base
> has_many :bikes, :dependent => :nullify
> end
>
> class Bike < ActiveRecord::Base
> belongs_to Invoice
> end
>
> now a bike does not necessarily belongs to any invoice, so a bike
> with invoice_id = nil is perfectly valid.
> If I now create a new Invoice and ask for its bikes, everything
> works as expected:
>
> ruby-1.9.3-head :001 > Invoice.new.bikes
> => []
>
> To my surprise now:
>
> ruby-1.9.3-head :002 > Invoice.new.bikes.count
> (1.9ms) SELECT COUNT(*) FROM "bikes" WHERE
> "bikes"."invoice_id" IS NULL
> => 744
>
> and even better (Bike has an attribute :price)
>
> ruby-1.9.3-head :003 > Invoice.new.bikes.sum(&:price)
> Bike Load (30.4ms) SELECT "bikes".* FROM "bikes"
WHERE
> "bikes"."invoice_id" IS NULL
> => 809577.5
>
> Well I see that the sql is perfectly logical, but nonetheless not
> very practical.
> Do I really have to do something ugly like
>
> class Invoice < ActiveRecord::Base
> has_many :bikes, :dependent => :nullify, :conditions =>
> ''invoice_id IS NOT NULL''
> end
>
> or do I simply miss the point?
>
> cheers
> robbytobby
>
>
>
> --
> You received this message because you are subscribed to the Google
> Groups "Ruby on Rails: Core" group.
> To view this discussion on the web visit
> https://groups.google.com/d/msg/rubyonrails-core/-/kL11IVcm0DQJ.
> To post to this group, send email to
> rubyonrails-core@googlegroups.com
> <mailto:rubyonrails-core@googlegroups.com>.
> To unsubscribe from this group, send email to
> rubyonrails-core+unsubscribe@googlegroups.com
> <mailto:rubyonrails-core%2Bunsubscribe@googlegroups.com>.
> For more options, visit this group at
> http://groups.google.com/group/rubyonrails-core?hl=en.
>
>
> --
> 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@googlegroups.com.
> To unsubscribe from this group, send email to
> rubyonrails-core+unsubscribe@googlegroups.com.
> For more options, visit this group at
> http://groups.google.com/group/rubyonrails-core?hl=en.
Yes, are are acknowledged of these issues but we didn''t figure out the best way to solve they. See https://github.com/rails/rails/issues/5215 Rafael Mendonça França http://twitter.com/rafaelfranca https://github.com/rafaelfranca On Thu, Oct 4, 2012 at 3:15 PM, widu <widu@fahrradwerkstatt-freiburg.de>wrote:> Thanks for your fast reply. I just checked out the 3-2-stable branch and > the count problem is fixed. However the sum issue > > ruby-1.9.3-head :003 > Invoice.new.bikes.sum(&:price) > Bike Load (30.4ms) SELECT "bikes".* FROM "bikes" WHERE > "bikes"."invoice_id" IS NULL > => 809577.5 > > still remains. But the same fix works for the sum method > > activerecord/lib/active_record/associations/collection_association.rb > > # Calculate sum using SQL, not Enumerable > def sum(*args) > return 0 if owner.new_record? > if block_given? > scoped.sum(*args) { |*block_args| yield(*block_args) } > else > scoped.sum(*args) > end > end > > I do apologize for not making a pull request, but I don''t know how to do > that propperly with test etc, and right now, I''ve got no nerve to read a > howto on that topic. > > Am 04.10.2012 18:27, schrieb Rafael Mendonça França: > > > > It is a bug and we fixed it yesterday on master > > <https://github.com/rails/rails/pull/6978>. I''m backporting the fixes > > to 3-2-stable right now. > > > > > > Rafael Mendonça França > > http://twitter.com/rafaelfranca > > https://github.com/rafaelfranca > > > > > > > > On Thu, Oct 4, 2012 at 11:43 AM, robbytobby > > <widu@fahrradwerkstatt-freiburg.de > > <mailto:widu@fahrradwerkstatt-freiburg.de>> wrote: > > > > Hey > > > > I'' m quite surprised by the behaviour of has_many associations on > > new_records, so might someone here tell me if I''m simply missing > > the point or is it a Bug? > > > > ruby 1.9.3p265 > > Rails 3.2.8 > > > > class Invoice < ActiveRecord::Base > > has_many :bikes, :dependent => :nullify > > end > > > > class Bike < ActiveRecord::Base > > belongs_to Invoice > > end > > > > now a bike does not necessarily belongs to any invoice, so a bike > > with invoice_id = nil is perfectly valid. > > If I now create a new Invoice and ask for its bikes, everything > > works as expected: > > > > ruby-1.9.3-head :001 > Invoice.new.bikes > > => [] > > > > To my surprise now: > > > > ruby-1.9.3-head :002 > Invoice.new.bikes.count > > (1.9ms) SELECT COUNT(*) FROM "bikes" WHERE > > "bikes"."invoice_id" IS NULL > > => 744 > > > > and even better (Bike has an attribute :price) > > > > ruby-1.9.3-head :003 > Invoice.new.bikes.sum(&:price) > > Bike Load (30.4ms) SELECT "bikes".* FROM "bikes" WHERE > > "bikes"."invoice_id" IS NULL > > => 809577.5 > > > > Well I see that the sql is perfectly logical, but nonetheless not > > very practical. > > Do I really have to do something ugly like > > > > class Invoice < ActiveRecord::Base > > has_many :bikes, :dependent => :nullify, :conditions => > > ''invoice_id IS NOT NULL'' > > end > > > > or do I simply miss the point? > > > > cheers > > robbytobby > > > > > > > > -- > > You received this message because you are subscribed to the Google > > Groups "Ruby on Rails: Core" group. > > To view this discussion on the web visit > > https://groups.google.com/d/msg/rubyonrails-core/-/kL11IVcm0DQJ. > > To post to this group, send email to > > rubyonrails-core@googlegroups.com > > <mailto:rubyonrails-core@googlegroups.com>. > > To unsubscribe from this group, send email to > > rubyonrails-core+unsubscribe@googlegroups.com > > <mailto:rubyonrails-core%2Bunsubscribe@googlegroups.com>. > > For more options, visit this group at > > http://groups.google.com/group/rubyonrails-core?hl=en. > > > > > > -- > > 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@googlegroups.com. > > To unsubscribe from this group, send email to > > rubyonrails-core+unsubscribe@googlegroups.com. > > For more options, visit this group at > > http://groups.google.com/group/rubyonrails-core?hl=en. > > >-- 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@googlegroups.com. To unsubscribe from this group, send email to rubyonrails-core+unsubscribe@googlegroups.com. For more options, visit this group at http://groups.google.com/group/rubyonrails-core?hl=en.