Как добавить id_user_created и id_user_edited в таблицу планов в rails

#ruby-on-rails

#ruby-on-rails

Вопрос:

Я новичок в rails и программировании вообще. Я должен добавить своего рода id_user_created и id_user_edited в таблицу с именем Plan. Эти идентификаторы помогут мне узнать, какой пользователь создал и отредактировал план, но я понятия не имею, как это сделать. В моей схеме БД нет связи между пользователем и планом, но теперь, когда мне нужно добавить идентификаторы тезисов, я предполагаю, что мне придется создать связь, верно? Большое спасибо.

Модели

 class Plan < ApplicationRecord
  has_many :users
end
  
 class User < ApplicationRecord

  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :validatable
  belongs_to :plan
end
  

Контроллер

 class PlansController < ApplicationController

  def new
    @plan = Plan.new
  end
 
  def create
    @user = current_user
    @plan = Plan.new(plan_params)
    @plan.user = @user

    if @plan.save
      redirect_to plan_path(@plan), notice: 'O plano foi criado com sucesso.'
    else
      render :new
    end
  end

  def edit
    @plan = Plan.find(params[:id])
  end

  def update
    @plan = Plan.find(params[:id])
    if @plan.update(plan_params)
      redirect_to @plan, notice: 'O plano foi editado com sucesso.'
    else
      render :edit
    end
  end


  private

  def plan_params
    params.require(:plan).permit(:name, :duration, :price, :status, :default)
  end
  
end
  
  

Маршрут

 Rails.application.routes.draw do
  devise_for :users

  root to: 'pages#home'
  
  resources :plans do
    resources :accounts, only: %i[new create] do
    end
  end

  resources :payments, only: %i[index]
  resources :accounts, only: %i[index show edit update destroy] do
    resources :users, only: %i[new create] do
      resources :roles
    end
  end
  
  resources :users, only: %i[index show edit update destroy]
  

Форма планов

 <%= simple_form_for [@user, @plan] do |f| %>
  <%= f.input :name, label: 'Nome' %>
  <%= f.input :duration, label: 'Duração' %>
  <%= f.input :price, label: 'Preço' %>
  <%= f.input :status %>
  <%= f.input :default %>
  <%= f.button :submit, class:"btn-outline-secondary" %>
<% end %>
  

Комментарии:

1. что вы видите в таблице ur db. ? вы определили отношения между таблицами планов и пользователей при их создании ?.

Ответ №1:

В Rails вы создаете миграции для создания внешних ключей, используя references тип (он же belongs_to ):

 rails g migration add_user_to_plans user:references
  

Который генерирует следующую миграцию:

 class AddUserToPlans < ActiveRecord::Migration[6.0]
  def change
    add_reference :plans, :user, null: false, foreign_key: true
  end
end
  

При запуске миграции создается plans.user_id столбец, который указывает на таблицу users.

Если вы хотите вызвать столбец / ассоциацию как-то иначе, creator_id вам нужно явно указать rails, на какую таблицу вы ссылаетесь. Просто не вызывайте свои столбцы id_user_created , если не хотите, чтобы они выглядели как полная снежинка.

 class AddCreatorToPlans < ActiveRecord::Migration[6.0]
  def change
    add_reference :plans, :creator, 
      null: false, 
      foreign_key: { to_table: :users }
  end
end
  

И вам также необходимо явно настроить свою ассоциацию:

 class Plan
  belongs_to :creator, 
   class_name: 'User',
   inverse_of: :plans
end

class User
  has_many :plans, 
    foreign_key: :creator_id,
    inverse_of: :plans
end
  

Ваша форма также отключена. Когда вы имеете дело с созданием ресурсов в качестве зарегистрированного пользователя, вам не нужно / нужно вкладывать маршрут.

 <%= simple_form_for @plan do |f| %>
  <%= f.input :name, label: 'Nome' %>
  <%= f.input :duration, label: 'Duração' %>
  <%= f.input :price, label: 'Preço' %>
  <%= f.input :status %>
  <%= f.input :default %>
  <%= f.button :submit, class:"btn-outline-secondary" %>
<% end %>
  

И вы также можете обрезать этот метод создания, создав ресурс из ассоциации для текущего пользователя:

 def create
  @plan = current_user.plans.new(plan_params)
  if @plan.save
    redirect_to @plan, 
      notice: 'O plano foi criado com sucesso.'
  else
    render :new
  end
end
  

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

Ответ №2:

 **Try add 's' to model in database relationship**



  class User < ApplicationRecord
      devise :database_authenticatable, :registerable,
             :recoverable, :rememberable, :validatable
      belongs_to :plans
    end

 <%= simple_form_for [@user, @user.plans] do |f| %>
      <%= f.input :name, label: 'Nome' %>
      <%= f.input :duration, label: 'Duração' %>
      <%= f.input :price, label: 'Preço' %>
      <%= f.input :status %>
      <%= f.input :default %>
      <%= f.button :submit, class:"btn-outline-secondary" %>
    <% end %>