Validation of has_and_belongs_to_many in Ruby on Rails

0

I have the following models:

class Pedido < ActiveRecord::Base
  has_and_belongs_to_many :produtos
  validate :has_one_or_less_produtos

  private

  def has_one_or_less_produtos
    errors.add(:produtos, 'Não é permitido mais de 1 produto') if produtos.size >= 1
  end
end

class Produto < ActiveRecord::Base
  has_and_belongs_to_many :pedidos
end

However when adding more than one product to the order:

Pedido.first.produtos << Produto.last

The validation does not work, what's the problem?

    
asked by anonymous 10.12.2015 / 12:03

2 answers

0

I do not know if the correct approach would be many to many for this case, but since you are doing this you should have an intermediate table of this relationship, create a model of it eg.

class PedidosProdutos < ActiveRecord::Base 
  #caso o nome da tabela seja pedidos_produtos poderia ser produtos_pedidos 
  belongs_to :pedido
  belongs_to :produtos
  validates_uniqueness_of :pedido_id
end

class Pedido < ActiveRecord::Base
  has_many :pedidos_produtos
  has_many :produtos, through: :pedidos_produtos

end

class Produto < ActiveRecord::Base
  has_many :pedidos_produtos
  has_many :pedidos, through: :pedidos_produtos
end

In this way two products will not be added for the same order

    
16.12.2015 / 13:01
0

Ben-Hur, Your logic is almost right, but for many to many there is a simpler way to do it, rather than using many has_many in multiple tables,

Example

class PedidosProdutos < ActiveRecord::Base
  belongs_to :pedido
  belongs_to :produtos
  validates_uniqueness_of :pedido_id
end

class Pedido < ActiveRecord::Base
  has_and_belongs_to_many :produtos, :join_table => :pedidos_produtos
end

class Produto < ActiveRecord::Base
 belongs_to :pedidos
end
    
17.12.2015 / 15:46