Question

I have two models join by a middle model

class Integration < ActiveRecord::Base
 has_many :integration_records
 has_many :records, through: :integration_records
end

class IntegrationRecord < ActiveRecord::Base
 belongs_to :integration
 belongs_to :record
end

class Record < ActiveRecord::Base
 has_many :integration_records
 has_many :integrations, through: :integration_records
end



  i = Integration.create(whatever)
  i.records.create(whatever)
  => (0.1ms)  BEGIN
  SQL (8.7ms)  INSERT INTO "records" ("created_at", "updated_at") VALUES ($1, $2) RETURNING "id"  [["created_at", Sat, 03 May 2014 00:31:02 UTC +00:00], ["updated_at", Sat, 03 May 2014 00:31:02 UTC +00:00]]
  SQL (0.6ms)  INSERT INTO "records" ("created_at", "updated_at") VALUES ($1, $2) RETURNING "id"  [["created_at", Sat, 03 May 2014 00:31:06 UTC +00:00], ["updated_at", Sat, 03 May 2014 00:31:06 UTC +00:00]]
 (0.4ms)  COMMIT

  i.records 
  => [one record]

  Record.all.count
  => 2

  i.integration_records
  => #<IntegrationRecord id: nil, integration_id: 1, record_id: 2 > 

Notice id is nil

  IntegrationRecord.all
  => #<ActiveRecord::Relation []> 

  IntegrationRecord.create
  => #<IntegrationRecord id: nil, integration_id: nil, record_id: nil>

Notice id is nil

  Record.create.integrations.create
  => (0.1ms)  BEGIN
     SQL (8.7ms)  INSERT INTO "integrations" ("created_at", "updated_at") VALUES ($1, $2) RETURNING "id"  [["created_at", Sat, 03 May 2014 00:31:02 UTC +00:00], ["updated_at", Sat, 03 May 2014 00:31:02 UTC +00:00]]
     SQL (0.6ms)  INSERT INTO "records" ("created_at", "updated_at") VALUES ($1, $2) RETURNING "id"  [["created_at", Sat, 03 May 2014 00:31:06 UTC +00:00], ["updated_at", Sat, 03 May 2014 00:31:06 UTC +00:00]]
     (0.4ms)  COMMIT

Not sure why this is happening, in the case of i.records.create(whatever) it should output:

      SQL (0.6ms)  INSERT INTO "records" ("created_at", "updated_at") VALUES ($1, $2) RETURNING "id"  [["created_at", Sat, 03 May 2014 00:31:06 UTC +00:00], ["updated_at", Sat, 03 May 2014 00:31:06 UTC +00:00]]
     (0.4ms)  COMMIT
      INSERT INTO "integration_records" ("created_at", "data", "integration_id", "updated_at") VALUES ($1, $2, $3, $4) RETURNING "id"  [["created_at", Sat, 03 May 2014 15:57:05 UTC +00:00], ["data", {}], ["integration_id", 5], ["updated_at", Sat, 03 May 2014 15:57:05 UTC +00:00]]

I should note that for some reason, when I create a new app in rails 4.0.4, I still had this problem. But when I change the names of the models and specifically Record model, it works perfectly fine. So when I changed it to Recordrow no problem at all.

Was it helpful?

Solution

As per your current association setup, all you need to do is, just follow these simple instructions step by step

  1. Create an Integration record

    ## this will create an "integration" record in "integrations" table
    integration = Integration.create(whatever) 
    
  2. Create an associated Record record

    ## this will create an associated "record" entry in "records" table
    ## PLUS this will also created an associated record in "integration_records" table
    integration.records.create(whatever)
    
  3. View the associated records and associated integration_records

    ## Display all the "records" entries associated to this particular integration
    integration.records
    
    ## Display all the "integration_records" entries associated to this particular integration
    integration.integration_records
    

UPDATE

i.records.create(whatever) was creating 2 records, found out that the issue was with the name records of the table. Once changed everything works fine. It looks like records is reserved word.

Also, OP found this link which states records is reserved

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top