验证一个对象是不是有一个或多个关联对象
Posted
技术标签:
【中文标题】验证一个对象是不是有一个或多个关联对象【英文标题】:Validate that an object has one or more associated objects验证一个对象是否有一个或多个关联对象 【发布时间】:2012-03-21 01:22:49 【问题描述】:我需要确保在创建产品时它至少具有一个类别。 我可以使用自定义验证类来做到这一点,但我希望有一种更标准的方式来做到这一点。
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.产品 + 类别是认识has_and_belongs_to_many
api.rubyonrails.org/classes/ActiveRecord/Associations/… 的绝佳机会。除非您不想在关联旁边存储其他属性,否则您不需要加入模型。 2.你可以使用这个问题的最佳答案***.com/questions/6429389/…猜你要改变什么:)
【参考方案1】:
有一个验证将检查您的关联长度。试试这个:
class Product < ActiveRecord::Base
has_many :product_categories
has_many :categories, :through => :product_categories
validates :categories, :length => :minimum => 1
end
【讨论】:
如何编写规范来测试这个? @abhishek77in 我发现了一些说要使用it should validate_length_of(:categories).is_at_least(1)
的东西,但是我收到一个错误,说每个字符串的未定义方法。我认为测试存在性可能会起到作用,因为它需要至少有一个记录。【参考方案2】:
我建议使用钩子方法而不是 wpgreenway 的解决方案,如 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
【讨论】:
【参考方案3】:确保它至少有一个类别:
class Product < ActiveRecord::Base
has_many :product_categories
has_many :categories, :through => :product_categories
validates :categories, :presence => true
end
我发现使用:presence
的错误消息比使用length minimum 1
验证更清晰
【讨论】:
以上是关于验证一个对象是不是有一个或多个关联对象的主要内容,如果未能解决你的问题,请参考以下文章
VBA:如何通过集合、“迟到”字典、其他方式关联多个对象实例?
定递归验证关联的对象可以用于继承对象吗 spring validate