Как сохранить отношение has_many в Ruby on Rails, используя гем Devise? - PullRequest
0 голосов
/ 30 декабря 2018

Модель пользователя

class User < ApplicationRecord
  belongs_to :tenant, dependent: :destroy
end

Модель арендатора

class Tenant < ApplicationRecord
    has_many :users
end

Контроллер

class Accounts::RegistrationsController < Devise::RegistrationsController

Использование build_

def create
    @tenant = Tenant.new
    @user = @tenant.build_user(params)
    @tenant.save
end

Использование модели

def create
    @tenant = Tenant.new
    @user = User.build(params)
    @tenant.save
end

SQL:

  • Добавлен внешний ключ.

Работает

  • Возможность отдельно добавлять данные модели пользователя.
  • Возможность отдельно добавлять данные модели арендатора.

Не работает

  • Невозможно сопоставить идентификатор из таблицы tenant с идентификатором tenant_id таблицы пользователя.Я перепробовал много возможностей, но не работал.Пожалуйста, направьте меня.

Снимок экрана DB enter image description here

** Примечание: *

Я используюПридумай самоцвет.

Ответы [ 2 ]

0 голосов
/ 30 декабря 2018

В соответствии с описанием, упомянутым в посте, похоже, что ссылка арендатора не сохраняется в таблице пользователей.

Так как арендатор имеет отношение has_many с пользователями, таким образом, что-то вроде упомянутого ниже может сделатьчтобы это работало:

def create
  @tenant = Tenant.find(params[:id])
  @user = @tenant.users.build(params)
  @user.save
end

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

https://api.rubyonrails.org/classes/ActiveRecord/NestedAttributes/ClassMethods.html

0 голосов
/ 30 декабря 2018

Проблема в том, что build_ создано для модели, принадлежащей.

Например, вы можете сделать:

Loading development environment (Rails 5.2.1)
2.4.1 :001 > user = User.new(name:'James Kirk')
 => #<User id: nil, name: "James Kirk", created_at: nil, updated_at: nil, tenant_id: nil> 
2.4.1 :002 > user.build_tenant(name:'Enterprise')
 => #<Tenant id: nil, name: "Enterprise", created_at: nil, updated_at: nil> 
2.4.1 :003 > user.save
   (0.1ms)  begin transaction
  Tenant Create (0.6ms)  INSERT INTO "tenants" ("name", "created_at", "updated_at") VALUES (?, ?, ?)  [["name", "Enterprise"], ["created_at", "2018-12-30 15:05:52.531519"], ["updated_at", "2018-12-30 15:05:52.531519"]]
  User Create (0.6ms)  INSERT INTO "users" ("name", "created_at", "updated_at", "tenant_id") VALUES (?, ?, ?, ?)  [["name", "James Kirk"], ["created_at", "2018-12-30 15:05:52.534295"], ["updated_at", "2018-12-30 15:05:52.534295"], ["tenant_id", 2]]
   (1.3ms)  commit transaction
 => true 

Выше сохранен арендаторзатем передает идентификатор пользователю и сохраняет его.

Но вы не можете:

2.4.1 :004 > tenant = Tenant.new(name:'Hazzard')
 => #<Tenant id: nil, name: "Hazzard", created_at: nil, updated_at: nil> 
2.4.1 :005 > tenant.build_user(name:'Uncle Jesse')
NoMethodError: undefined method `build_user' for #<Tenant:0x007ff2bbd9b650>


Опция для вашего рабочего процесса: Сохраните экземпляр Tenant ранее, получите id, затем сохраните экземпляр User:
2.4.1 :009 > tenant = Tenant.new(name:'Hazzard')
 => #<Tenant id: nil, name: "Hazzard", created_at: nil, updated_at: nil> 
2.4.1 :010 > tenant.save
   (0.1ms)  begin transaction
  Tenant Create (0.7ms)  INSERT INTO "tenants" ("name", "created_at", "updated_at") VALUES (?, ?, ?)  [["name", "Hazzard"], ["created_at", "2018-12-30 15:12:36.122931"], ["updated_at", "2018-12-30 15:12:36.122931"]]
   (1.7ms)  commit transaction
 => true 
2.4.1 :011 > user = User.new(name:'Uncle Jesse', tenant_id: tenant.id)
 => #<User id: nil, name: "Uncle Jesse", created_at: nil, updated_at: nil, tenant_id: 4> 
2.4.1 :012 > user.save
   (0.1ms)  begin transaction
  Tenant Load (0.2ms)  SELECT  "tenants".* FROM "tenants" WHERE "tenants"."id" = ? LIMIT ?  [["id", 4], ["LIMIT", 1]]
  User Create (0.4ms)  INSERT INTO "users" ("name", "created_at", "updated_at", "tenant_id") VALUES (?, ?, ?, ?)  [["name", "Uncle Jesse"], ["created_at", "2018-12-30 15:12:52.119957"], ["updated_at", "2018-12-30 15:12:52.119957"], ["tenant_id", 4]]
   (0.9ms)  commit transaction
 => true 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...