has_many through middle model not creating, but creating duplicate of one model

雨燕双飞 提交于 2019-12-23 05:21:02

问题


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.


回答1:


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



来源:https://stackoverflow.com/questions/23438421/has-many-through-middle-model-not-creating-but-creating-duplicate-of-one-model

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!