ruby-on-rails - framework - tutorial django
Validar que un objeto tenga uno o más objetos asociados (3)
Necesito asegurarme de que cuando se crea un producto tiene al menos una categoría. Podría hacer esto con una clase de validación personalizada, pero esperaba que hubiera una forma más estándar de hacerlo.
class Product < ActiveRecord::Base
has_many :product_categories
has_many :categories, :through => :product_categories #must have at least 1
end
class Category < ActiveRecord::Base
has_many :product_categories
has_many :products, :through => :product_categories
end
class ProductCategory < ActiveRecord::Base
belongs_to :product
belongs_to :category
end
Asegura que tiene al menos una categoría:
class Product < ActiveRecord::Base
has_many :product_categories
has_many :categories, :through => :product_categories
validates :categories, :presence => true
end
Encuentro el mensaje de error usando :presence
es más clara que con la validación length minimum 1
En lugar de la solución de wpgreenway, sugeriría utilizar un método de enlace como before_save y usar una asociación has_and_belongs_to_many.
class Product < ActiveRecord::Base
has_and_belongs_to_many :categories
before_save :ensure_that_a_product_belongs_to_one_category
def ensure_that_a_product_belongs_to_one_category
if self.category_ids < 1
errors.add(:base, "A product must belongs to one category at least")
return false
else
return true
end
end
class ProductsController < ApplicationController
def create
params[:category] ||= []
@product.category_ids = params[:category]
.....
end
end
Y en su opinión, use puede usar, por ejemplo, options_from_collection_for_select
Hay una validación que verificará la duración de su asociación. Prueba esto:
class Product < ActiveRecord::Base
has_many :product_categories
has_many :categories, :through => :product_categories
validates :categories, :length => { :minimum => 1 }
end