<commit_before># == Schema Information
#
# Table name: canjes
#
#  id          :integer          not null, primary key
#  antiguo_id  :integer
#  nuevo_id    :integer
#  producto_id :integer
#  fecha       :datetime
#  created_at  :datetime
#  updated_at  :datetime
#  tipo        :string(255)
#

class Canje < ActiveRecord::Base
  #relationship
    belongs_to :antiguo, :class_name => "IngresoProducto", :foreign_key => "antiguo_id", :inverse_of => :antiguos
    belongs_to :nuevo, :class_name => "IngresoProducto", :foreign_key => "nuevo_id", :inverse_of => :nuevos
    belongs_to :producto

#validations
	validates :fecha, :tipo, :presence =>true, :if => :changing_with_same

# nested
  accepts_nested_attributes_for :nuevo, :producto

#callbacks
  before_validation :set_values

#methods
  
  def changing_with_same
    self.tipo == "mismo_producto"
  end

  def nuevo_attributes=(attributes)
    if attributes['id'].present?
      self.nuevo = IngresoProducto.find(attributes['id'])
    else
      attributes['cantidad'] = self.antiguo.cantidad
      attributes['producto_id'] = self.antiguo.producto_id
    end
    super
  end

  def producto_attributes=(attributes)
    if attributes['id'].present?
      self.producto = Producto.find(attributes['id'])
    end
    super
  end

  private

  def set_values
    self.antiguo = IngresoProducto.find(self.antiguo_id)
    self.fecha = Time.now
    self.cantidad = self.antiguo.cantidad
    self.precio_salida = self.antiguo.producto.precio_compra
    self.total = self.precio_salida
    Lineakardex.create(:kardex => self.antiguo.producto.kardex, :tipo => "Salida", :fecha => Time.now, :cantidad => self.antiguo.cantidad, :v_unitario => self.antiguo.producto.precio_compra, :observaciones => "Producto Canjeado")     
    self.antiguo.cantidad = 0
    self.antiguo.save 
  end

end
<commit_msg>validando la presencia de los nested dependiendo del caso<commit_after># == Schema Information
#
# Table name: canjes
#
#  id          :integer          not null, primary key
#  antiguo_id  :integer
#  nuevo_id    :integer
#  producto_id :integer
#  fecha       :datetime
#  created_at  :datetime
#  updated_at  :datetime
#  tipo        :string(255)
#

class Canje < ActiveRecord::Base
  #relationship
    belongs_to :antiguo, :class_name => "IngresoProducto", :foreign_key => "antiguo_id", :inverse_of => :antiguos
    belongs_to :nuevo, :class_name => "IngresoProducto", :foreign_key => "nuevo_id", :inverse_of => :nuevos
    belongs_to :producto

#validations
	validates :fecha, :tipo, :presence =>true

# nested
  accepts_nested_attributes_for :nuevo, :reject_if => :changing_with_other
  accepts_nested_attributes_for :producto, :reject_if => :changing_with_same

#callbacks
  before_validation :set_values

#methods
  
  def changing_with_same
    self.tipo == "mismo_producto"
  end

  def changing_with_other
    self.tipo == "otro_producto"
  end

  def nuevo_attributes=(attributes)
    if attributes['id'].present?
      self.nuevo = IngresoProducto.find(attributes['id'])
    else
      attributes['cantidad'] = self.antiguo.cantidad
      attributes['producto_id'] = self.antiguo.producto_id
    end
    super
  end

  def producto_attributes=(attributes)
    if attributes['id'].present?
      self.producto = Producto.find(attributes['id'])
    end
    super
  end

  private

  def set_values
    self.antiguo = IngresoProducto.find(self.antiguo_id)
    self.fecha = Time.now
    self.cantidad = self.antiguo.cantidad
    self.precio_salida = self.antiguo.producto.precio_compra
    self.total = self.precio_salida
    Lineakardex.create(:kardex => self.antiguo.producto.kardex, :tipo => "Salida", :fecha => Time.now, :cantidad => self.antiguo.cantidad, :v_unitario => self.antiguo.producto.precio_compra, :observaciones => "Producto Canjeado")     
    self.antiguo.cantidad = 0
    self.antiguo.save 
  end

end

{'fraction_non_alphanumeric': 0.11119711042311661, 'fraction_numerical': 0.0020639834881320948, 'mean_word_length': 3.780517879161529, 'pattern_counts': {'":': 0, '<': 5, '<?xml version=': 0, '>': 32, 'https://': 0, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 0, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'dir': 'git-commits-cleaned', 'id': '4510285', 'n_tokens_mistral': 1400, 'n_tokens_neox': 1393, 'n_words': 262}