Сохранение в Ruby on Rails для модели has_many в has_many не срабатывает при сборке - PullRequest
0 голосов
/ 05 сентября 2018

У нас есть эта модель под названием "Cliente" (cliente.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

И модель "Алерта" (alertta.rb):

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

Таблица SQL:

enter image description here

И после этого мы создали таблицу соединений.

 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

Таблица SQL называется "alertas_clientes", и его структура очень проста

enter image description here

Модель файловая (alertas_cliente.rb):

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

Но консоль показывает:

Processing by AlertasController#sendnoti as HTML
  Cliente Load (0.3ms)  SELECT  `clientes`.* FROM `clientes` WHERE `clientes`.`id` = 6 LIMIT 1
  ↳ app/controllers/alertas_controller.rb:37
  Alerta Load (0.2ms)  SELECT  `alerta`.* FROM `alerta` WHERE `alerta`.`id` = 1 LIMIT 1
  ↳ app/controllers/alertas_controller.rb:39
   (0.1ms)  BEGIN
  ↳ app/controllers/alertas_controller.rb:41
   (0.1ms)  ROLLBACK
  ↳ app/controllers/alertas_controller.rb:41
wrong number of arguments (given 1, expected 0)

Я что-то упустил?

С уважением.

Ответы [ 2 ]

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

Я уже знаю, что на самом деле произошло, проблема была в поле имени, все отношения были хорошими, но проблема была в том, что Модель "Alerta" имеет поле с именем "отправить" это, очевидно, зарезервированное слово рубина. Я изменил на "отправлено" и все работает отлично.

Я знаю, это странно, но было бы неплохо, если бы Rails мог показать этот тип ошибки.

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

Глядя на запросы, отображаемые с ошибкой, кажется, что вы не создали 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 в базе данных, включите код в строки 39 и 41 в соответствии с запросом @ Beartech.

В любом случае я бы использовал простой .alerts, так как он более понятен, и в этом вся идея объявления through: :alertas_clientes на модели. Существует больше способов создания новой записи для many_to_many ассоциации, как объяснено здесь .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...