Brazhnyk Yuriy
Brazhnyk Yuriy

Reputation: 504

Create model with it's relations

I'm trying to migrate my project from Rails 5.0 to 5.2

Project extensively uses creation of related models through .build_%related_model%, it was working on rails 5.0 and now it's broke. Does this functionality removed, or should i use another syntax?

class User < ActiveRecord::Base
  belongs_to :profile, inverse_of: :user
end

class Profile < ActiveRecord::Base
  has_one :user, inverse_of: :profile
end

new_user = User.new
new_user.build_profile
new_user.save

Previously this code created both User and his Profile. Now this will create only User, without Profile.

Any ideas how to fix this?

Upvotes: 0

Views: 45

Answers (2)

Brazhnyk Yuriy
Brazhnyk Yuriy

Reputation: 504

accepts_nested_attributes_for :profile fixed this exact issue, but many other have popped up.

I had to stop this update and rollback everything.

Upvotes: 0

Imre Raudsepp
Imre Raudsepp

Reputation: 1198

irb(main):001:0> new_user = User.new
=> #<User id: nil, profile_id: nil, created_at: nil, updated_at: nil>
irb(main):002:0> new_user.build_profile
=> #<Profile id: nil, created_at: nil, updated_at: nil>
irb(main):003:0> new_user.save
   (0.1ms)  begin transaction
  SQL (0.3ms)  INSERT INTO "profiles" ("created_at", "updated_at") VALUES (?, ?)  [["created_at", "2018-04-21 13:16:23.669286"], ["updated_at", "2018-04-21 13:16:23.669286"]]
  Profile Load (0.2ms)  SELECT  "profiles".* FROM "profiles" WHERE "profiles"."id" = ? LIMIT ?  [["id", 1], ["LIMIT", 1]]
  SQL (0.2ms)  INSERT INTO "users" ("profile_id", "created_at", "updated_at") VALUES (?, ?, ?)  [["profile_id", 1], ["created_at", "2018-04-21 13:16:23.691292"], ["updated_at", "2018-04-21 13:16:23.691292"]]
   (181.1ms)  commit transaction
=> true
class CreateUsers < ActiveRecord::Migration[5.1]
  def change
    create_table :users do |t|
      t.integer :profile_id
      t.timestamps
    end
  end
end
class CreateProfiles < ActiveRecord::Migration[5.1]
  def change
    create_table :profiles do |t|

      t.timestamps
    end
  end
end
class User < ApplicationRecord
  belongs_to :profile, inverse_of: :user
end
class Profile < ApplicationRecord
  has_one :user, inverse_of: :profile
end

tested it out all worked. Copied code to answer since its not readable in comment. Your problem must be somewhere else do u get any errors or paste migration files to under question

Upvotes: 1

Related Questions