Hi, on Rails 2.2RC1 I''ve found a what appears to be a bug in ActiveRecord STI classes: class ItemCollection < ActiveRecord::Base class Order < ItemCollection class ReplenishmentOrder < Order The problem is that instances of ReplenishmentOrder are initially not found via Order.find(:id), as shown below. After searching the subclass directly (second query), the SQL of searching the parent class changes (see third query in log below). Console:>> Order.find(510)ActiveRecord::RecordNotFound: Couldn''t find Order with ID=510 from /Users/zubin/ww/g2/vendor/rails/activerecord/lib/ active_record/base.rb:1528:in `find_one'' from /Users/zubin/ww/g2/vendor/rails/activerecord/lib/ active_record/base.rb:1511:in `find_from_ids'' from /Users/zubin/ww/g2/vendor/rails/activerecord/lib/ active_record/base.rb:590:in `find'' from (irb):1>> ReplenishmentOrder.find(510)=> #<ReplenishmentOrder id: 510, parent_id: nil, user_id: 28, payment_method_id: nil, billing_address_id: 1, shipping_address_id: 1, type: "ReplenishmentOrder", status: "editing", ref: nil, despatched_at: nil, created_at: "2008-10-28 04:42:54", updated_at: "2008-10-29 05:04:30", total: #<BigDecimal:5d92998,''0.0'',4(8)>, freight_total: #<BigDecimal:5d9295c,''0.0'',4(8)>, redeemed_total: #<BigDecimal:5d92920,''0.0'',4(8)>>>> Order.find(510)=> #<ReplenishmentOrder id: 510, parent_id: nil, user_id: 28, payment_method_id: nil, billing_address_id: 1, shipping_address_id: 1, type: "ReplenishmentOrder", status: "editing", ref: nil, despatched_at: nil, created_at: "2008-10-28 04:42:54", updated_at: "2008-10-29 05:04:30", total: #<BigDecimal:5d8ff54,''0.0'',4(8)>, freight_total: #<BigDecimal:5d8ff18,''0.0'',4(8)>, redeemed_total: #<BigDecimal:5d8fedc,''0.0'',4(8)>>>>Log: $ tail log/development.log Order Columns (185.4ms) SHOW FIELDS FROM `item_collections` Order Load (97.8ms) SELECT * FROM `item_collections` WHERE (`item_collections`.`id` = 510) AND ( (`item_collections`.`type` ''Order'' ) ) ReplenishmentOrder Columns (2.5ms) SHOW FIELDS FROM `item_collections` ReplenishmentOrder Load (0.4ms) SELECT * FROM `item_collections` WHERE (`item_collections`.`id` = 510) AND ( (`item_collections`.`type` = ''ReplenishmentOrder'' ) ) Order Load (0.5ms) SELECT * FROM `item_collections` WHERE (`item_collections`.`id` = 510) AND ( (`item_collections`.`type` ''Order'' OR `item_collections`.`type` = ''ReplenishmentOrder'' ) ) -Zubin --~--~---------~--~----~------------~-------~--~----~ 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 -~----------~----~----~----~------~----~------~--~---
On 29 Oct 2008, at 10:22, zubin wrote:> > Hi, on Rails 2.2RC1 I''ve found a what appears to be a bug in > ActiveRecord STI classes: >This isn''t new. It''s in fact enough to just load the ReplenishmentOrder class (ie require_dependency ''replenishment_order'') for Order.find to find instances of ReplenishmentOrder. Until that has happened the ReplenishmentOrder class doesn''t even exist and so activerecord doesn''t know to add it to the type condition. This is a little fiddly. Fred> class ItemCollection < ActiveRecord::Base > class Order < ItemCollection > class ReplenishmentOrder < Order > > The problem is that instances of ReplenishmentOrder are initially not > found via Order.find(:id), as shown below. > After searching the subclass directly (second query), the SQL of > searching the parent class changes (see third query in log below). > > Console: > >>> Order.find(510) > ActiveRecord::RecordNotFound: Couldn''t find Order with ID=510 > from /Users/zubin/ww/g2/vendor/rails/activerecord/lib/ > active_record/base.rb:1528:in `find_one'' > from /Users/zubin/ww/g2/vendor/rails/activerecord/lib/ > active_record/base.rb:1511:in `find_from_ids'' > from /Users/zubin/ww/g2/vendor/rails/activerecord/lib/ > active_record/base.rb:590:in `find'' > from (irb):1 >>> ReplenishmentOrder.find(510) > => #<ReplenishmentOrder id: 510, parent_id: nil, user_id: 28, > payment_method_id: nil, billing_address_id: 1, shipping_address_id: 1, > type: "ReplenishmentOrder", status: "editing", ref: nil, > despatched_at: nil, created_at: "2008-10-28 04:42:54", updated_at: > "2008-10-29 05:04:30", total: #<BigDecimal:5d92998,''0.0'',4(8)>, > freight_total: #<BigDecimal:5d9295c,''0.0'',4(8)>, redeemed_total: > #<BigDecimal:5d92920,''0.0'',4(8)>> >>> Order.find(510) > => #<ReplenishmentOrder id: 510, parent_id: nil, user_id: 28, > payment_method_id: nil, billing_address_id: 1, shipping_address_id: 1, > type: "ReplenishmentOrder", status: "editing", ref: nil, > despatched_at: nil, created_at: "2008-10-28 04:42:54", updated_at: > "2008-10-29 05:04:30", total: #<BigDecimal:5d8ff54,''0.0'',4(8)>, > freight_total: #<BigDecimal:5d8ff18,''0.0'',4(8)>, redeemed_total: > #<BigDecimal:5d8fedc,''0.0'',4(8)>> >>> > > Log: > > $ tail log/development.log > Order Columns (185.4ms) SHOW FIELDS FROM `item_collections` > Order Load (97.8ms) SELECT * FROM `item_collections` WHERE > (`item_collections`.`id` = 510) AND ( (`item_collections`.`type` > ''Order'' ) ) > ReplenishmentOrder Columns (2.5ms) SHOW FIELDS FROM > `item_collections` > ReplenishmentOrder Load (0.4ms) SELECT * FROM `item_collections` > WHERE (`item_collections`.`id` = 510) AND ( (`item_collections`.`type` > = ''ReplenishmentOrder'' ) ) > Order Load (0.5ms) SELECT * FROM `item_collections` WHERE > (`item_collections`.`id` = 510) AND ( (`item_collections`.`type` > ''Order'' OR `item_collections`.`type` = ''ReplenishmentOrder'' ) ) > > -Zubin > > > >--~--~---------~--~----~------------~-------~--~----~ 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 -~----------~----~----~----~------~----~------~--~---
This probably happens because you''re in development mode where the AR model classes are not all automatically loaded, so if you find through Order you only get Order and ItemCollection because neither is aware of the existance of ReplenishmentOrder until it has been loaded. A hack fix for this is to put: "require_association ''order''" at the bottom of item_collection.rb and "require_association ''replenishment_order''" at the bottom of order.rb On K, 2008-10-29 at 03:22 -0700, zubin wrote:> Hi, on Rails 2.2RC1 I''ve found a what appears to be a bug in > ActiveRecord STI classes: > > class ItemCollection < ActiveRecord::Base > class Order < ItemCollection > class ReplenishmentOrder < Order > > The problem is that instances of ReplenishmentOrder are initially not > found via Order.find(:id), as shown below. > After searching the subclass directly (second query), the SQL of > searching the parent class changes (see third query in log below). > > Console: > > >> Order.find(510) > ActiveRecord::RecordNotFound: Couldn''t find Order with ID=510 > from /Users/zubin/ww/g2/vendor/rails/activerecord/lib/ > active_record/base.rb:1528:in `find_one'' > from /Users/zubin/ww/g2/vendor/rails/activerecord/lib/ > active_record/base.rb:1511:in `find_from_ids'' > from /Users/zubin/ww/g2/vendor/rails/activerecord/lib/ > active_record/base.rb:590:in `find'' > from (irb):1 > >> ReplenishmentOrder.find(510) > => #<ReplenishmentOrder id: 510, parent_id: nil, user_id: 28, > payment_method_id: nil, billing_address_id: 1, shipping_address_id: 1, > type: "ReplenishmentOrder", status: "editing", ref: nil, > despatched_at: nil, created_at: "2008-10-28 04:42:54", updated_at: > "2008-10-29 05:04:30", total: #<BigDecimal:5d92998,''0.0'',4(8)>, > freight_total: #<BigDecimal:5d9295c,''0.0'',4(8)>, redeemed_total: > #<BigDecimal:5d92920,''0.0'',4(8)>> > >> Order.find(510) > => #<ReplenishmentOrder id: 510, parent_id: nil, user_id: 28, > payment_method_id: nil, billing_address_id: 1, shipping_address_id: 1, > type: "ReplenishmentOrder", status: "editing", ref: nil, > despatched_at: nil, created_at: "2008-10-28 04:42:54", updated_at: > "2008-10-29 05:04:30", total: #<BigDecimal:5d8ff54,''0.0'',4(8)>, > freight_total: #<BigDecimal:5d8ff18,''0.0'',4(8)>, redeemed_total: > #<BigDecimal:5d8fedc,''0.0'',4(8)>> > >> > > Log: > > $ tail log/development.log > Order Columns (185.4ms) SHOW FIELDS FROM `item_collections` > Order Load (97.8ms) SELECT * FROM `item_collections` WHERE > (`item_collections`.`id` = 510) AND ( (`item_collections`.`type` > ''Order'' ) ) > ReplenishmentOrder Columns (2.5ms) SHOW FIELDS FROM > `item_collections` > ReplenishmentOrder Load (0.4ms) SELECT * FROM `item_collections` > WHERE (`item_collections`.`id` = 510) AND ( (`item_collections`.`type` > = ''ReplenishmentOrder'' ) ) > Order Load (0.5ms) SELECT * FROM `item_collections` WHERE > (`item_collections`.`id` = 510) AND ( (`item_collections`.`type` > ''Order'' OR `item_collections`.`type` = ''ReplenishmentOrder'' ) ) > > -Zubin > > > >--~--~---------~--~----~------------~-------~--~----~ 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 guys, that did the trick. -Zubin On Oct 29, 9:35 pm, Tarmo Tänav <ta...@itech.ee> wrote:> This probably happens because you''re in development mode where > the AR model classes are not all automatically loaded, so if you find > through Order you only get Order and ItemCollection because neither > is aware of the existance of ReplenishmentOrder until it has been > loaded. > > A hack fix for this is to put: > "require_association ''order''" at the bottom of item_collection.rb > and > "require_association ''replenishment_order''" at the bottom of order.rb > > On K, 2008-10-29 at 03:22 -0700, zubin wrote: > > > Hi, on Rails 2.2RC1 I''ve found a what appears to be a bug in > > ActiveRecord STI classes: > > > class ItemCollection < ActiveRecord::Base > > class Order < ItemCollection > > class ReplenishmentOrder < Order > > > The problem is that instances of ReplenishmentOrder are initially not > > found via Order.find(:id), as shown below. > > After searching the subclass directly (second query), the SQL of > > searching the parent class changes (see third query in log below). > > > Console: > > > >> Order.find(510) > > ActiveRecord::RecordNotFound: Couldn''t find Order with ID=510 > > from /Users/zubin/ww/g2/vendor/rails/activerecord/lib/ > > active_record/base.rb:1528:in `find_one'' > > from /Users/zubin/ww/g2/vendor/rails/activerecord/lib/ > > active_record/base.rb:1511:in `find_from_ids'' > > from /Users/zubin/ww/g2/vendor/rails/activerecord/lib/ > > active_record/base.rb:590:in `find'' > > from (irb):1 > > >> ReplenishmentOrder.find(510) > > => #<ReplenishmentOrder id: 510, parent_id: nil, user_id: 28, > > payment_method_id: nil, billing_address_id: 1, shipping_address_id: 1, > > type: "ReplenishmentOrder", status: "editing", ref: nil, > > despatched_at: nil, created_at: "2008-10-28 04:42:54", updated_at: > > "2008-10-29 05:04:30", total: #<BigDecimal:5d92998,''0.0'',4(8)>, > > freight_total: #<BigDecimal:5d9295c,''0.0'',4(8)>, redeemed_total: > > #<BigDecimal:5d92920,''0.0'',4(8)>> > > >> Order.find(510) > > => #<ReplenishmentOrder id: 510, parent_id: nil, user_id: 28, > > payment_method_id: nil, billing_address_id: 1, shipping_address_id: 1, > > type: "ReplenishmentOrder", status: "editing", ref: nil, > > despatched_at: nil, created_at: "2008-10-28 04:42:54", updated_at: > > "2008-10-29 05:04:30", total: #<BigDecimal:5d8ff54,''0.0'',4(8)>, > > freight_total: #<BigDecimal:5d8ff18,''0.0'',4(8)>, redeemed_total: > > #<BigDecimal:5d8fedc,''0.0'',4(8)>> > > > Log: > > > $ tail log/development.log > > Order Columns (185.4ms) SHOW FIELDS FROM `item_collections` > > Order Load (97.8ms) SELECT * FROM `item_collections` WHERE > > (`item_collections`.`id` = 510) AND ( (`item_collections`.`type` > > ''Order'' ) ) > > ReplenishmentOrder Columns (2.5ms) SHOW FIELDS FROM > > `item_collections` > > ReplenishmentOrder Load (0.4ms) SELECT * FROM `item_collections` > > WHERE (`item_collections`.`id` = 510) AND ( (`item_collections`.`type` > > = ''ReplenishmentOrder'' ) ) > > Order Load (0.5ms) SELECT * FROM `item_collections` WHERE > > (`item_collections`.`id` = 510) AND ( (`item_collections`.`type` > > ''Order'' OR `item_collections`.`type` = ''ReplenishmentOrder'' ) ) > > > -Zubin--~--~---------~--~----~------------~-------~--~----~ 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 -~----------~----~----~----~------~----~------~--~---