This has been killing me this weekend. Doing a has_many fetch is
accurate the first time only.
Here’s a simple example:
tp = TestParent.new(:name => “testing”)
tp.save!
tc = TestChild.new(:name => “test1”, :test_parent_id => tp.id)
tc.save!
tc = TestChild.new(:name => “test2”, :test_parent_id => tp.id)
tc.save!
tc = TestChild.new(:name => “test3”, :test_parent_id => tp.id)
tc.save!
tp.test_children.map {|x| x.name }.to_sentence # => “test1, test2, and
test3” CORRECT
tc = TestChild.new(:name => “test4”, :test_parent_id => tp.id)
tc.save!
tp.test_children.map {|x| x.name }.to_sentence # => “test1, test2, and
test3” WRONG!
tp = TestParent.find(tp.id)
tp.test_children.map {|x| x.name }.to_sentence # => “test1, test2,
test3, and test4” CORRECT
In my case, we were preparing an order of line items (the children of
the order) and then fetching the results to get a subtotal to add one
last line item (think tax or such) but then the last line item is lost
on the following receipt page, mailers, etc.
This is Rails 4.0.8, Pg 0.17.1, ruby 2.1.1p30 (2014-02-10 revision
44904) [x86_64-linux]. Models and migration are very, very basic in the
test above:
---- migration
class HasManyTest < ActiveRecord::Migration
def self.up
execute %{
CREATE TABLE test_parents (
id serial primary key,
created_at timestamp ,
updated_at timestamp,
name varchar(255)
);
CREATE TABLE test_children (
id serial primary key,
created_at timestamp ,
updated_at timestamp,
name varchar(255),
test_parent_id int4 references test_parents(id)
);
}
end
def self.down
raise “No you can’t!”
end
end
class TestParent < ActiveRecord::Base
has_many :test_children
end
class TestChild < ActiveRecord::Base
belongs_to :test_parent
end
Is this a known problem? It’s hard to believe others haven’t
experienced this? :’) Or is this an obscure result of some sort of
caching or such I should be turning off?
Thanks!
Phil