如何在Rails中使用has_and_belongs_to_many创建修复错误

时间:2019-05-03 07:28:13

标签: ruby-on-rails has-and-belongs-to-many

我想在联接表中创建一条记录,但是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保存在联接表中。根据Rails官方网站指南,怎么了?

第一个错误:

  

用户的未知属性“ channel_id”。

第二个错误:

  

Class:0x00007feaa0312058的未定义方法`users'

3 个答案:

答案 0 :(得分:1)

我假设您具有这样的关联:

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类对象,因为它们之间没有Model,而您只有一个中间表。相反,您可以这样做:

# 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])

这根本无效,因为类ChannelUser没有任何直接关系,但是Channel类的实例可能与{{1 }}类。

答案 1 :(得分:0)

对于第一种情况,我建议您应该这样做

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

它将创建连接表记录,您可以确定是否可以尝试优化方法。

答案 2 :(得分:0)

您也可以使用push或<<方法来代替create:Channel.users.push(attrs)或Channel.users <<(attrs)和第二个答案也很好,但是.ids不太可读 或者您可以按ID查找频道并使用它:channel.users.create(attrs)

请参阅api.rubyonrails.org,然后在搜索栏中搜索has_and_belongs_to_many方法