Just to add to Mel’s comments (I’m working with him):
We could find no logical reason why one of our associations always
saved and the others never did on a creation of a new owner. For
example:
f = Foo.new
f.ass_1_ids = [1,2,3]
f.ass_2_ids = [1,2,3]
f.ass_3_ids = [1,2,3]
f.save
ass_1s always were persisted.
ass_2s and ass_3s never were.
I experimented with the issue in script/console for quite a while
last night, even switching dbs from Sqlite to MySql and even changing
our table column names to be totally rails conventional. Nothing
changed.
Interestingly, one of the associations that always failed on the web
app worked in the console.
Another datapoint is that the associations were fetched with now
problems when assigned to the owner (an excerpt from my console):
?> r = Recipe.new
=> #<Recipe:0x252c94c @attributes={“name”=>nil,
“experiment_type_id”=>nil, “replicate_type_id”=>nil,
“description”=>nil, “workorder_id”=>nil}, @new_record=true>
r.name = ‘kinase recipe’
=> “kinase recipe”
r.description = ‘description’
=> “description”
assign the kinases:
r.kinase_ids=[1,2,3]
=> [1, 2, 3]
r
=> #<Recipe:0x252c94c @attributes={“name”=>“kinase recipe”,
“experiment_type_id”=>nil, “replicate_type_id”=>nil,
“description”=>“description”, “workorder_id”=>nil}, @new_record=true,
@kinases=[#<Kinase:0x251fe2c @attributes=
{“ref_inhib_compound_id”=>“10”, “name”=>“c-RAF(h)”,
“active_f”=>“17807”, “sort_order”=>“1”,
“ref_inhib_10atp_compound_conc”=>“10”, “id”=>“1”, “simple_name”=>nil,
“ref_inhib_100atp_compound_conc”=>“10”, “description”=>“45.00000000”,
“catalog_number”=>“c-RAF(h)”, “km_conc”=>“47.00000000”,
“ref_inhib_known_value”=>“14”}>, #<Kinase:0x251fdf0 @attributes=
{“ref_inhib_compound_id”=>“1”, “name”=>“MEK1(h)”,
“active_f”=>“17809”, “sort_order”=>“1”,
“ref_inhib_10atp_compound_conc”=>“1”, “id”=>“2”, “simple_name”=>nil,
“ref_inhib_100atp_compound_conc”=>“10”, “description”=>“10.00000000”,
“catalog_number”=>“MEK1(h)”, “km_conc”=>“126.00000000”,
“ref_inhib_known_value”=>“14”}>, #<Kinase:0x251fdb4 @attributes=
{“ref_inhib_compound_id”=>“30”, “name”=>“MAPK2(m)”,
“active_f”=>“17802”, “sort_order”=>“1”,
“ref_inhib_10atp_compound_conc”=>“30”, “id”=>“3”, “simple_name”=>nil,
“ref_inhib_100atp_compound_conc”=>“10”,
“description”=>“155.00000000”, “catalog_number”=>“MAPK2(m)”,
“km_conc”=>“122.00000000”, “ref_inhib_known_value”=>“14”}>]>
the kinases were found!
As Mel said, our solution is to save the owner first, then add the
associations and save again.
For those who want more data, here’s a longer segment of my console
output, with one that works and one that doesn’t:
Create a new Recipe:
r = Recipe.new
=> #<Recipe:0x2586820 @attributes={“name”=>nil,
“experiment_type_id”=>nil, “replicate_type_id”=>nil,
“description”=>nil, “workorder_id”=>nil}, @new_record=true>
r.name = ‘foo’
=> “foo”
r.description = ‘bar’
=> “bar”
Add some atp_concentrations (many to many)
r.atp_concentration_ids=[1,2]
=> [1, 2]
r
=> #<Recipe:0x2586820 @attributes={“name”=>“foo”,
“experiment_type_id”=>nil, “replicate_type_id”=>nil,
“description”=>“bar”, “workorder_id”=>nil}, @atp_concentrations=
[#<AtpConcentration:0x254c490 @attributes={“id”=>“1”,
“description”=>“KM”}>, #<AtpConcentration:0x254c454 @attributes=
{“id”=>“2”, “description”=>“10”}>], @new_record=true>
r.save
=> true
r.id
=> 15
r = Recipe.find 15
=> #<Recipe:0x25377c0 @attributes={“name”=>“foo”,
“experiment_type_id”=>nil, “replicate_type_id”=>nil, “id”=>“15”,
“description”=>“bar”, “workorder_id”=>nil}>
r
=> #<Recipe:0x25377c0 @attributes={“name”=>“foo”,
“experiment_type_id”=>nil, “replicate_type_id”=>nil, “id”=>“15”,
“description”=>“bar”, “workorder_id”=>nil}>
r.atp_concentrations
=> [#<AtpConcentration:0x252fd2c @attributes=
{“atp_concentration_id”=>“1”, “recipe_id”=>“15”, “id”=>“1”,
“description”=>“KM”}>, #<AtpConcentration:0x252fcf0 @attributes=
{“atp_concentration_id”=>“2”, “recipe_id”=>“15”, “id”=>“2”,
“description”=>“10”}>]
atp_concentrations worked fine on a Recipe.new… r.save
?> #### now for a kinase:
?> r = Recipe.new
=> #<Recipe:0x252c94c @attributes={“name”=>nil,
“experiment_type_id”=>nil, “replicate_type_id”=>nil,
“description”=>nil, “workorder_id”=>nil}, @new_record=true>
r.name = ‘kinase recipe’
=> “kinase recipe”
r.description = ‘description’
=> “description”
r.kinase_ids=[1,2,3]
=> [1, 2, 3]
r
=> #<Recipe:0x252c94c @attributes={“name”=>“kinase recipe”,
“experiment_type_id”=>nil, “replicate_type_id”=>nil,
“description”=>“description”, “workorder_id”=>nil}, @new_record=true,
@kinases=[#<Kinase:0x251fe2c @attributes=
{“ref_inhib_compound_id”=>“10”, “name”=>“c-RAF(h)”,
“active_f”=>“17807”, “sort_order”=>“1”,
“ref_inhib_10atp_compound_conc”=>“10”, “id”=>“1”, “simple_name”=>nil,
“ref_inhib_100atp_compound_conc”=>“10”, “description”=>“45.00000000”,
“catalog_number”=>“c-RAF(h)”, “km_conc”=>“47.00000000”,
“ref_inhib_known_value”=>“14”}>, #<Kinase:0x251fdf0 @attributes=
{“ref_inhib_compound_id”=>“1”, “name”=>“MEK1(h)”,
“active_f”=>“17809”, “sort_order”=>“1”,
“ref_inhib_10atp_compound_conc”=>“1”, “id”=>“2”, “simple_name”=>nil,
“ref_inhib_100atp_compound_conc”=>“10”, “description”=>“10.00000000”,
“catalog_number”=>“MEK1(h)”, “km_conc”=>“126.00000000”,
“ref_inhib_known_value”=>“14”}>, #<Kinase:0x251fdb4 @attributes=
{“ref_inhib_compound_id”=>“30”, “name”=>“MAPK2(m)”,
“active_f”=>“17802”, “sort_order”=>“1”,
“ref_inhib_10atp_compound_conc”=>“30”, “id”=>“3”, “simple_name”=>nil,
“ref_inhib_100atp_compound_conc”=>“10”,
“description”=>“155.00000000”, “catalog_number”=>“MAPK2(m)”,
“km_conc”=>“122.00000000”, “ref_inhib_known_value”=>“14”}>]>
the kinases were found!
?> r.save!
=> true
now let’s refetch the data
?> r.id
=> 16
r = Recipe.find 16
=> #<Recipe:0x250d830 @attributes={“name”=>“kinase recipe”,
“experiment_type_id”=>nil, “replicate_type_id”=>nil, “id”=>“16”,
“description”=>“description”, “workorder_id”=>nil}>
r.kinases
=> []
they were not saved
?> #### but if I add them to this object and do an update, they will
?> r.kinase_ids=[1,2,3]
=> [1, 2, 3]
r
=> #<Recipe:0x250d830 @attributes={“name”=>“kinase recipe”,
“experiment_type_id”=>nil, “replicate_type_id”=>nil, “id”=>“16”,
“description”=>“description”, “workorder_id”=>nil}, @kinases=
[#<Kinase:0x2503010 @attributes={“ref_inhib_compound_id”=>“10”,
“name”=>“c-RAF(h)”, “active_f”=>“17807”, “sort_order”=>“1”,
“ref_inhib_10atp_compound_conc”=>“10”, “id”=>“1”, “simple_name”=>nil,
“ref_inhib_100atp_compound_conc”=>“10”, “description”=>“45.00000000”,
“catalog_number”=>“c-RAF(h)”, “km_conc”=>“47.00000000”,
“ref_inhib_known_value”=>“14”}>, #<Kinase:0x2502fd4 @attributes=
{“ref_inhib_compound_id”=>“1”, “name”=>“MEK1(h)”,
“active_f”=>“17809”, “sort_order”=>“1”,
“ref_inhib_10atp_compound_conc”=>“1”, “id”=>“2”, “simple_name”=>nil,
“ref_inhib_100atp_compound_conc”=>“10”, “description”=>“10.00000000”,
“catalog_number”=>“MEK1(h)”, “km_conc”=>“126.00000000”,
“ref_inhib_known_value”=>“14”}>, #<Kinase:0x2502f98 @attributes=
{“ref_inhib_compound_id”=>“30”, “name”=>“MAPK2(m)”,
“active_f”=>“17802”, “sort_order”=>“1”,
“ref_inhib_10atp_compound_conc”=>“30”, “id”=>“3”, “simple_name”=>nil,
“ref_inhib_100atp_compound_conc”=>“10”,
“description”=>“155.00000000”, “catalog_number”=>“MAPK2(m)”,
“km_conc”=>“122.00000000”, “ref_inhib_known_value”=>“14”}>]>
r.save
=> true
r.id
=> 16
r = Recipe.find 16
=> #<Recipe:0x24ef90c @attributes={“name”=>“kinase recipe”,
“experiment_type_id”=>nil, “replicate_type_id”=>nil, “id”=>“16”,
“description”=>“description”, “workorder_id”=>nil}>
r.kinases
=> [#<Kinase:0x24eb0dc @attributes={“ref_inhib_compound_id”=>“10”,
“name”=>“c-RAF(h)”, “active_f”=>“17807”, “sort_order”=>“1”,
“kinase_id”=>“1”, “recipe_id”=>“16”,
“ref_inhib_10atp_compound_conc”=>“10”, “id”=>“1”, “simple_name”=>nil,
“ref_inhib_100atp_compound_conc”=>“10”, “description”=>“45.00000000”,
“catalog_number”=>“c-RAF(h)”, “km_conc”=>“47.00000000”,
“ref_inhib_known_value”=>“14”}>, #<Kinase:0x24eb0a0 @attributes=
{“ref_inhib_compound_id”=>“1”, “name”=>“MEK1(h)”,
“active_f”=>“17809”, “sort_order”=>“1”, “kinase_id”=>“2”,
“recipe_id”=>“16”, “ref_inhib_10atp_compound_conc”=>“1”, “id”=>“2”,
“simple_name”=>nil, “ref_inhib_100atp_compound_conc”=>“10”,
“description”=>“10.00000000”, “catalog_number”=>“MEK1(h)”,
“km_conc”=>“126.00000000”, “ref_inhib_known_value”=>“14”}>, #<Kinase:
0x24eb064 @attributes={“ref_inhib_compound_id”=>“30”, “name”=>“MAPK2
(m)”, “active_f”=>“17802”, “sort_order”=>“1”, “kinase_id”=>“3”,
“recipe_id”=>“16”, “ref_inhib_10atp_compound_conc”=>“30”, “id”=>“3”,
“simple_name”=>nil, “ref_inhib_100atp_compound_conc”=>“10”,
“description”=>“155.00000000”, “catalog_number”=>“MAPK2(m)”,
“km_conc”=>“122.00000000”, “ref_inhib_known_value”=>“14”}>]