我们有一个简单的应用程序,我们创建了这些模型:
class Cliente < ApplicationRecord
has_and_belongs_to_many :hardware
end
和
class Hardware < ApplicationRecord
has_and_belongs_to_many :clientes
end
我们创建了一个名为"clientes_hardwares“的中间表,当我们为客户端分配硬件时,我们想要在表中设置另一个字段"vigencia",表:
在我们的控制器上我们设置:
def sethardware
@cliente = Cliente.find(params[:cliente_id])
@cliente.hardware << Hardware.find(params[:hardware_id])
@cliente.hardware.build(:vigencia => "2018-01-01")
if @cliente.save
flash[:info] = 'Cliente creado correctamente'
redirect_to action: 'show', id: params[:cliente_id]
else
flash[:alert] = 'Error al crear el usuario'
redirect_to action: 'show', id: params[:cliente_id]
end
end
不使用这一行:
@cliente.hardware.build(:vigencia => "2018-01-01")
它可以工作并设置client_id和hardware_id,我们如何设置名为"vigencia“的额外字段,因为如果我们调用like build和like param,则表明硬件没有该属性?
问候
发布于 2018-09-04 08:34:50
如果需要向连接表(clientes_hardwares)添加属性,<<方法(不显式使用连接表)将不起作用,因为它不设置任何附加属性(请注意,附加属性不在客户端或硬件中,而是在连接表中)。您必须定义并改用联接模型:
class Cliente < ApplicationRecord
has_many :clientes_hardwares
has_many :hardwares through: :clientes_hardwares
end
class Hardware < ApplicationRecord
has_many :clientes_hardwares
has_many :clientes through: :clientes_hardwares
end
class ClientesHardware < ApplicationRecord
belongs to :cliente
belongs to :hardware
end
def sethardware
@cliente = Cliente.find(params[:cliente_id])
@hardware = Hardware.find(params[:hardware_id])
@cliente.clientes_hardwares.build(
:hardware => @hardware,
:vigencia => "2018-01-01"
)
if @cliente.save
flash[:info] = 'Cliente creado correctamente'
redirect_to action: 'show', id: params[:cliente_id]
else
flash[:alert] = 'Error al crear el usuario'
redirect_to action: 'show', id: params[:cliente_id]
end
end
https://stackoverflow.com/questions/52157260
复制相似问题