Как сохранить две модели, которые требуют присутствия друг друга - PullRequest
0 голосов
/ 08 июля 2019

Пользователи принадлежат к Гильдии и могут создавать и владеть другими.

При создании учетной записи для пользователя создается гильдия Home, которая уникально функционирует среди других гильдий.

Я пробовал user=User.new ==> user.home.build, но это не работает.

Я продолжаю получать NoMethodError: undefined method 'build' for nil:NilClass

# == Schema Information
#
# Table name: guilds
#
#  id         :bigint           not null, primary key
#  is_home    :boolean          default(FALSE)
#  name       :string           not null
#  owner_id   :integer          not null
#  member_id  :integer          not null
#  created_at :datetime         not null
#  updated_at :datetime         not null
#

class Guild < ApplicationRecord
    belongs_to :owner, class_name: :User

    has_many :guild_members, class_name: :User

    # Trying here.
    def self.create_home(user) 
        home = Guild.new(is_home: true, name: user.name, owner_id: user.id ) 
    end
end


# frozen_string_literal: true

# == Schema Information
#
# Table name: users
#
#  id              :bigint           not null, primary key
#  username        :string           not null
#  digits          :integer          not null
#  email           :string
#  password_digest :string           not null
#  session_token   :string           not null
#  created_at      :datetime         not null
#  updated_at      :datetime         not null
#  home_id         :integer          not null
#

class User < ApplicationRecord
  has_one :home, class_name: :Guild, foreign_key: :home_id

  belongs_to :guild
end

1 Ответ

0 голосов
/ 12 июля 2019

Синтаксис метода построения отличается для has_one и has_many ассоциаций.

class User < ApplicationRecord
    has_one :home, class_name: :Guild, foreign_key: :home_id
    #Let's say user has many messages
    has_many :messages

    belongs_to :guild
end

Синтаксис для ассоциации has_many:

user.messages.build

Синтаксис для ассоциации has_one:

user.build_home  # this will work

user.home.build  # this will throw error

Для получения более подробной информации ознакомьтесь с ассоциацией has_one Документация .

...