Ruby on Rails在模型has_many到has_many上保存不会在构建时触发

时间:2018-09-04 22:49:46

标签: ruby-on-rails ruby activerecord

我们有一个称为“ Cliente”(cliente.rb)的模型:

var obj = db.company.find(_id:"5b8ed214b460e7c17c5a33f9").toArray();

var count = obj[0].cars.length

SQL表:

enter image description here

模型“ Alerta”(alerta.rb):

class Cliente < ApplicationRecord
    has_many :clientes_hardwares
    has_many :alertas_clientes
    has_many :sucursales
    has_many :alertas,   through: :alertas_clientes
    has_many :hardwares, through: :clientes_hardwares
end

SQL表:

enter image description here

然后,我们创建了一个联接表。

class Alerta < ApplicationRecord
    has_many :alertas_clientes
    has_many :clientes, through: :alertas_clientes
end

SQL表称为“ alertas_clientes”,其结构非常简单

enter image description here

模型是文件(alertas_cliente.rb):

 class CreateJoinTableClientesAlertas < ActiveRecord::Migration[5.2]
  def change
    create_join_table :clientes, :alertas do |t|
      # t.index [:cliente_id, :alerta_id]
      # t.index [:alerta_id, :cliente_id]
    end
  end
end

我们想将关系保存在表上,但控制台不会显示实际错误。

class AlertasCliente < ApplicationRecord
    belongs_to :cliente
    belongs_to :alerta
end

但是控制台显示:

 def savenoti
        begin
         @cliente = Cliente.find(6)
         @cliente.alertas_clientes.build(
            :alerta => Alerta.find(1)
         )
         @cliente.save
        rescue => exception
            puts exception.message
            flash[:alert] = 'Error al enviar alerta.'
            redirect_to action: 'index'
        end
    end

我想念什么吗?

提前考虑。

2 个答案:

答案 0 :(得分:1)

我已经知道实际发生了什么,问题是名称字段,所有相关性都很好,但是问题是模型“ Alerta” 有一个名为“ send”的字段显然是红宝石的保留字。我改为“已发送” ,并且一切正常。

我知道这很奇怪,但是如果Rails可以显示这种类型的错误,那就太好了。

答案 1 :(得分:0)

看着错误显示的查询,似乎您在Alerta内调用Alerta.find(1)时还没有创建savenoti

假设您尚未创建Alerta,但已经保存了客户端,则可以执行以下操作:

def savenoti
  begin
   @cliente = Cliente.find(6)
   alerta = Alerta.new # or a different builder if you have any info to save
   @cliente.alertas.create(alerta) //this will create and save the `AlertasCliente` instance.
  rescue => exception
      puts exception.message
      flash[:alert] = 'Error al enviar alerta.'
      redirect_to action: 'index'
  end
end

如果不是这种情况,并且您已经将Alerta保存到数据库,则按照@Beartech的要求在第39和41行中包含代码。

在任何情况下,我都会使用普通的.alerts,因为它更清晰,这就是在模型上声明through: :alertas_clientes的全部思想。如here所述,还有更多方法可以为many_to_many关联创建新记录。