#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 %>