如何修复 rails 中创建 has_and_belongs_to_many 的错误
How to fix error with has_and_belongs_to_many creation in rails
我想在连接中创建记录 table 但是 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
加入 table。根据rails官方网站指南,有什么问题吗?
第一个错误:
unknown attribute 'channel_id' for User.
第二个错误:
undefined method `users' for Class:0x00007feaa0312058
我假设你有这样的联想:
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
class 对象,因为中间没有模型,只有中间 table。相反,您可以这样做:
# 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
这将在中间创建一条新记录table,现有记录也将按原样存在。如果你这样做:
@channel.users = user
这将从中间删除所有现有的关联用户记录 table 并添加与该用户的新关联记录。
当你尝试这样做时:
Channel.users.create!(channel_id: params[:channel_id], user_id: params[:user_id])
这根本无效,因为 class Channel
与 User
没有任何直接关系,而是 Channel
[=34= 的一个实例] 可能与 User
class.
的实例相关联
对于第一种情况,我建议你应该这样做
@channel.user_ids = @channel.user_ids + [params[:user_id]]
它将创建连接 table 记录,您当然可以根据需要尝试优化方法。
您可以使用 push 或 << 方法代替 create :Channel.users.push(attrs) 或 Channel.users << (attrs) 和第二个答案也很好,但 .ids 不是很可读
或者您可以通过 ID 找到频道并使用它:channel.users.create(attrs)
查看 api.rubyonrails.org 并在搜索栏中搜索 has_and_belongs_to_many 方法
我想在连接中创建记录 table 但是 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
加入 table。根据rails官方网站指南,有什么问题吗?
第一个错误:
unknown attribute 'channel_id' for User.
第二个错误:
undefined method `users' for Class:0x00007feaa0312058
我假设你有这样的联想:
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
class 对象,因为中间没有模型,只有中间 table。相反,您可以这样做:
# 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
这将在中间创建一条新记录table,现有记录也将按原样存在。如果你这样做:
@channel.users = user
这将从中间删除所有现有的关联用户记录 table 并添加与该用户的新关联记录。
当你尝试这样做时:
Channel.users.create!(channel_id: params[:channel_id], user_id: params[:user_id])
这根本无效,因为 class Channel
与 User
没有任何直接关系,而是 Channel
[=34= 的一个实例] 可能与 User
class.
对于第一种情况,我建议你应该这样做
@channel.user_ids = @channel.user_ids + [params[:user_id]]
它将创建连接 table 记录,您当然可以根据需要尝试优化方法。
您可以使用 push 或 << 方法代替 create :Channel.users.push(attrs) 或 Channel.users << (attrs) 和第二个答案也很好,但 .ids 不是很可读 或者您可以通过 ID 找到频道并使用它:channel.users.create(attrs)
查看 api.rubyonrails.org 并在搜索栏中搜索 has_and_belongs_to_many 方法