我们具有用户的常规模型(user.rb):
型号:
class User < ApplicationRecord
has_many :clientes, through: :clientes_users
end
还有一个简单的客户端模型(cliente.rb):
型号:
class Cliente < ApplicationRecord
has_many :clientes_users
has_many :users, through: :clientes_users
end
我们创建了联接表(很多)(clientes_user.rb):
class ClientesUser < ApplicationRecord
belongs_to :cliente
belongs_to :user
end
创建用户时,我们使用:
@user = User.new(
:email => params[:email],
:access_level => params[:access_level],
:password => params[:password_first],
:password_confirmation => params[:password_confirmation]
)
params[:cliente_id].each do |cliente|
@user.clientes_users.build(
:cliente => Cliente.find(cliente)
)
end
@user.save
一切正常,我们的表存储数据:
但是当我们更新关系时,记录会使条目重复。
避免这种行为的最好方法是,如果不存在这种关系,则插入数据,但如果存在则只是忽略
提前考虑。
答案 0 :(得分:0)
定义一个has_many
关联也可以给您带来设置者和获取者的麻烦。 @user
应具有方法cliente_ids
和clientes_ids=
,可用于分配。您可以执行以下操作:
@user = User.create!(
email: params[:email],
access_level: params[:access_level],
password: params[:password_first],
password_confirmation: params[:password_confirmation],
cliente_ids: params[:cliente_id]
)
还请注意,password
和password_first
之间以及cliente_ids
和cliente_id
之间的不匹配会产生误导,两个名称都相同会很好案例。
当参数名称与模型属性相同时,您可以进一步执行以下操作:
@user = User.create!(user_params)
def user_params
params.require(:user).permit(:email, :access_level, :password, :password_confirmation, :cliente_ids)
end
即使控制器参数可能不在键require(:user)
之下,也要删除user
。
希望这会有所帮助。