Как исправить ошибку с созданием has_and_belongs_to_many в рельсах - PullRequest
0 голосов
/ 03 мая 2019

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

@channel = Channel.find(params[:channel_id])
 if @channel.users.create!(channel_id: params[:channel_id], user_id: params[:user_id])
     flash[:success] = "U Succeed:)"
     redirect_to request.referrer
 else
     flash[:danger] = "U Nit Succeed:H"
     redirect_to request.referrer
 end

вторая ситуация

 if Channel.users.create!(channel_id: params[:channel_id], user_id: params[:user_id])
     flash[:success] = "U Succeed:)"
     redirect_to request.referrer
 else
     flash[:danger] = "U'r Not Succeed:H"
     redirect_to request.referrer
 end

Я хочу сохранить attrs в таблице соединений. По словам официального сайта рельсов, что не так?

Первая ошибка:

неизвестный атрибут 'channel_id' для пользователя.

Вторая ошибка:

неопределенный метод `users 'для класса: 0x00007feaa0312058

Ответы [ 2 ]

1 голос
/ 03 мая 2019

Я предполагаю, что у вас есть ассоциации, подобные этим:

class User < ActiveRecord::Base
  has_and_belongs_to_many :channels
end

class Channel < ActiveRecord::Base
  has_and_belongs_to_many :users
end

Теперь вы пытаетесь сделать так:

@channel.users.create!(channel_id: params[:channel_id], user_id: params[:user_id])

Это попытается создать новый объект класса User, так как между ними нет модели, просто у вас есть средняя таблица. Вместо этого вы можете сделать это так:

# If you don't have the user object already
user = User.find params[:user_id]

# This will create a record in the mid table
@channel.users << user

Это создаст новую запись в средней таблице, и существующие записи также будут существовать как есть. И если вы делаете так:

@channel.users = user

Это удалит все существующие связанные записи пользователя из средней таблицы для этого канала и добавит новую связанную запись с этим пользователем.

И когда вы попытаетесь сделать так:

Channel.users.create!(channel_id: params[:channel_id], user_id: params[:user_id])

Это совершенно недопустимо, поскольку класс Channel не имеет прямого отношения к User, но экземпляр класса Channel может быть связан с экземплярами класса User.

0 голосов
/ 03 мая 2019

Для первого сценария, который я хотел бы предложить, вы должны сделать это, как

@channel.user_ids = @channel.user_ids  + [params[:user_id]]

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

...