我们有一个称为“ Cliente”(cliente.rb)的模型:
var obj = db.company.find(_id:"5b8ed214b460e7c17c5a33f9").toArray();
var count = obj[0].cars.length
SQL表:
模型“ 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表:
然后,我们创建了一个联接表。
class Alerta < ApplicationRecord
has_many :alertas_clientes
has_many :clientes, through: :alertas_clientes
end
SQL表称为“ alertas_clientes”,其结构非常简单
模型是文件(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
我想念什么吗?
提前考虑。
答案 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
关联创建新记录。