Мне нужна помощь в моделировании моих моделей и контроллера. Вот чего я хочу достичь:
Я хочу, чтобы у меня был пользователь с именем User (как обычно) и вторая модель с именем Project. Проект должен принадлежать одному пользователю и в то же время иметь много участников. Участниками проекта также должны быть пользователи (с разработкой регистрации / входа в систему), но пользователь, создавший проект, не должен иметь возможности участвовать. Все идет нормально. Вот небольшая часть: в моем контроллере я хочу написать:
def participate
p = Project.find(id: params[:id])
p.participants << current_user unless p.participants.includes?(current_user) && !p.user_id.equal(current_user.id)
if p.save
redirect_back
else
render :project
end
end
Это не работает, потому что p.participants не является массивом и запросом (я пробовал это в консоли rails)не проверяет мою таблицу. Вот мои текущие настройки модели:
class Project < ApplicationRecord
before_validation :set_uuid, on: :create
validates :id, presence: true
belongs_to :user
has_and_belongs_to_many :participants, class_name: "User"
end
class User < ApplicationRecord
before_validation :set_uuid, on: :create
validates :id, presence: true
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :validatable
has_and_belongs_to_many :projects
end
Наконец, мои миграции:
class CreateProjects < ActiveRecord::Migration[6.0]
def change
create_table :projects, id: false do |t|
t.string :id, limit: 36, primary_key: true
t.string :title
t.belongs_to :user, index: true, foreign_key: true, type: :uuid
t.datetime :published_at
t.timestamps
end
end
end
class CreateJoinTableProjectsUsers < ActiveRecord::Migration[6.0]
def change
create_join_table :users, :projects do |t|
t.index :project_id
t.index :user_id
end
end
end