【问题标题】:Rails Avoid Duplicate Records on Join Table has_many to has_manyRails 避免连接表 has_many 到 has_many 上的重复记录
【发布时间】:2018-09-06 20:58:46
【问题描述】:

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

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

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

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

提前问候。

【问题讨论】:

  • 您能告诉我们您的更新操作吗?您只粘贴了创建操作,如果我没记错的话,创建不是您要问的问题。
  • 嗨,对不起,你是对的@user = User.find(8) @user.clientes_users.build( :cliente =&gt; Cliente.find(6) ) @user.save

标签: ruby-on-rails activerecord orm


【解决方案1】:

定义has_many 关联还为您提供了setter 和getter。 @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

如果控制器参数不在 user 键范围内,则删除 require(:user),即使它们可能应该这样做。

希望这会有所帮助。

【讨论】:

  • 问题不在于如何调用,而在于插入数据时如何避免重复。
猜你喜欢
  • 1970-01-01
  • 2016-08-20
  • 1970-01-01
  • 2017-07-12
  • 2010-11-21
  • 2012-03-25
  • 1970-01-01
  • 2015-05-06
  • 2018-04-12
相关资源
最近更新 更多