用它的关系创建模型

时间:2018-04-21 12:50:32

标签: ruby-on-rails ruby-on-rails-5 rails-activerecord

我正在尝试将我的项目从Rails 5.0迁移到5.2

项目通过.build_%related_model%广泛使用相关模型的创建,它正在使用rails 5.0,现在它已经破产了。 是删除了这个功能,还是应该使用其他语法?

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

此前,此代码同时创建了User和他的Profile。现在,这将仅创建User,而不会Profile

任何想法如何解决这个问题?

2 个答案:

答案 0 :(得分:1)

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

测试了所有工作。复制的代码回答,因为它在评论中不可读。如果您遇到任何错误或将迁移文件粘贴到问题

,您的问题必须在其他地方

答案 1 :(得分:0)

accepts_nested_attributes_for :profile解决了这个问题,但很多其他问题已经出现了。

我必须停止此更新并回滚所有内容。