Validation of has_and_belongs_to_many in Ruby on Rails

Asked

Viewed 91 times

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

validation does not work, what’s the problem?

  • Why are you using :has_and_belongs_to_many if you want the order to have a maximum of 1 product?

  • Because it depends on the business rule, today I need it to be one, but my client can request to be two or more. That "1" of the validation, let’s say that it would be a parameter of the system.

2 answers

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 on 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

0

I don’t 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 ex.:

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

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

Browser other questions tagged

You are not signed in. Login or sign up in order to post.