Rails Вставьте Has_Many в Has_Many на таблицу с дополнительным полем - PullRequest
0 голосов
/ 04 сентября 2018

У нас есть простое приложение, мы создали следующие модели:

class Cliente < ApplicationRecord
    has_and_belongs_to_many :hardware
end

и

class Hardware < ApplicationRecord
    has_and_belongs_to_many :clientes
end

Мы создали промежуточную таблицу под названием «clientes_hardwares», когда мы назначаем оборудование клиенту, мы хотим установить другое поле в таблице под названием «vigencia», таблица:

enter image description here

На нашем контроллере мы установили:

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, это показывает, что у оборудования нет этого атрибута?

Привет

1 Ответ

0 голосов
/ 04 сентября 2018

Если вам нужно добавить атрибуты в таблицу соединений (clientes_hardwares), подход << (без явного использования таблицы соединений) не будет работать, так как он не устанавливает никаких дополнительных атрибутов (обратите внимание, что дополнительные атрибуты отсутствуют у клиентов или аппаратные средства, но в таблице соединений). Вместо этого вы должны определить и использовать модель соединения: </p>

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...