Убедитесь, что объект имеет один или несколько связанных объектов
Мне нужно убедиться, что при создании продукта он имеет по крайней мере одну категорию.
Я мог бы сделать это с помощью специального класса проверки, но я надеялся, что существует более стандартный способ сделать это.
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
Ответы
Ответ 1
Существует проверка, которая проверит длину вашей ассоциации. Попробуйте следующее:
class Product < ActiveRecord::Base
has_many :product_categories
has_many :categories, :through => :product_categories
validates :categories, :length => { :minimum => 1 }
end
Ответ 2
Обеспечивает наличие по меньшей мере одной категории:
class Product < ActiveRecord::Base
has_many :product_categories
has_many :categories, :through => :product_categories
validates :categories, :presence => true
end
Я обнаружил, что сообщение об ошибке с использованием :presence
более ясное, чем использование length minimum 1
validation
Ответ 3
Вместо решения wpgreenway я бы предложил использовать метод hook как before_save и использовать ассоциацию 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
И, на ваш взгляд, использование может использовать, например, options_from_collection_for_select