2012-03-02 17 views
25

मुझे यह सुनिश्चित करने की आवश्यकता है कि जब कोई उत्पाद बनाया जाए तो इसकी कम से कम एक श्रेणी हो। मैं इसे एक कस्टम सत्यापन वर्ग के साथ कर सकता था, लेकिन मुझे उम्मीद थी कि ऐसा करने का एक और मानक तरीका था।सत्यापित करें कि किसी ऑब्जेक्ट में एक या अधिक संबंधित ऑब्जेक्ट्स हैं

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 
+0

1. उत्पादों + श्रेणियां 'has_and_belongs_to_many' से मिलने का एक शानदार अवसर है http://api.rubyonrails.org/classes/ActiveRecor घ/संघों/ClassMethods.html # विधि-ए-has_and_belongs_to_many। जब तक आप एसोसिएशन के साथ अतिरिक्त विशेषताओं को स्टोर नहीं करना चाहते हैं, तब तक आपको मॉडल में शामिल होने की आवश्यकता नहीं है। 2. आप इस प्रश्न से शीर्ष उत्तर का उपयोग कर सकते हैं http://stackoverflow.com/questions/6429389/how-can-i-make-sure-my-has-many-will-have-a-size-of-at- कम से कम 2 अनुमान लगाएं कि आपको क्या बदलना है :) – jibiel

उत्तर

49

एक मान्यता है जो आपके संगठन की लंबाई की जांच करेगा। इस प्रयास करें:

class Product < ActiveRecord::Base 
    has_many :product_categories 
    has_many :categories, :through => :product_categories 

    validates :categories, :length => { :minimum => 1 } 
end 
+1

मैं इसका परीक्षण करने के लिए एक spec कैसे लिखूं? – abhishek77in

3

के बजाय wpgreenway के समाधान, मैं before_save के रूप में एक हुक विधि का उपयोग करें और एक has_and_belongs_to_many संघ उपयोग करने के लिए सुझाव है।

class Product < ActiveRecord::Base 
    has_many :product_categories 
    has_many :categories, :through => :product_categories 

    validates :categories, :presence => true 
end 

मैं का उपयोग कर :presencelength minimum 1 सत्यापन का उपयोग करने से स्पष्ट है त्रुटि संदेश दिखाई:

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

25

यह सुनिश्चित करता है कि यह कम से कम एक श्रेणी है के लिए उपयोग कर सकते हैं