2012-03-02 15 views
25

Bir ürün oluşturulduğunda en az bir kategori olduğundan emin olmalıyım. Bunu özel bir doğrulama sınıfı ile yapabilirdim, ancak bunu yapmanın daha standart bir yolu olduğunu umuyordum.Bir nesnenin bir veya daha fazla ilişkili nesneye sahip olduğunu doğrulayın

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. ürünler + kategoriler, has_and_belongs_to_many' ile tanışmak için harika bir fırsattır http://api.rubyonrails.org/classes/ActiveRecor d/Birlikler/ClassMethods.html # yöntemi-i has_and_belongs_to_many. İlişkilendirmenin yanında ek öznitelikleri saklamak istemediğiniz sürece katılma modeline ihtiyacınız yoktur. 2. Bu sorudan en iyi cevabı kullanabilirsiniz http://stackoverflow.com/questions/6429389/how-can-i-make-sure-my-has-many-will-have-a-size-of-at- En az 2 ne değişeceğini tahmin et :) – jibiel

cevap

49

Derneğinizin uzunluğunu kontrol edecek bir doğrulama var. Bu deneyin:

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

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

Bunu test etmek için nasıl teknik yazabilirim? – abhishek77in

3

yerine wpgreenway çözümü, ben before_save olarak bir kanca yöntemi kullanmak ve has_and_belongs_to_many dernek kullanmak öneririm.

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

    validates :categories, :presence => true 
end 

Ben :presencelength minimum 1 doğrulama kullanmaktan daha nettir kullanarak hata mesajı bulmak:

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 

Ve görünümünde

, kullanım örnek options_from_collection_for_select

25

en az bir kategori vardır sağlar için kullanabilirsiniz

İlgili konular