Rails避免在连接表has_many到has_many上重复记录

时间:2018-09-06 20:58:47

标签: ruby-on-rails activerecord orm

我们具有用户的常规模型(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

一切正常,我们的表存储数据:

enter image description here

但是当我们更新关系时,记录会使条目重复。

enter image description here

避免这种行为的最好方法是,如果不存在这种关系,则插入数据,但如果存在则只是忽略

提前考虑。

1 个答案:

答案 0 :(得分:0)

定义一个has_many关联也可以给您带来设置者和获取者的麻烦。 @user应具有方法cliente_idsclientes_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]
)

还请注意,passwordpassword_first之间以及cliente_idscliente_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

希望这会有所帮助。