with tutorial framework español djangoproject desde con cero applications ruby-on-rails validation has-many-through

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