2013-01-16 50 views
1

我有两个相关的模型:Group和Member。如何在rails中限制模型的嵌套属性数

Group.rb:

has_many :members, :dependent => :destroy 
accepts_nested_attributes_for :members, :reject_if => lambda { |a| a[:email].blank? and a[:id].blank? }, :allow_destroy => true 

我想要做的就是尽快将其阻止添加成员审定MEMBERS_COUNT达到25

所以,如果我编辑组,让我们说,例如:

  1. 我有20名现有成员
  2. 我在浏览器端增加从FORM 8名成员

它应该保存前5条记录,然后引发一个错误,例如“您已超出嵌套属性的限制”。

是否有任何内置方法在轨道中这样做。作为一个比较新手的铁轨,我不知道这一点?

+0

类似的问题:http://stackoverflow.com/questions/7863618/rails-3-1-limit- user-created-objects – siekfried

回答

8

在你的模型:

accepts_nested_attributes_for :field, limit: 10 

在您保存方法:

def update 
    begin 
    # normal model update 
    if Model.update_attributes(params[:your_model]) 
     flash[:notice] = 'Save success' 
    else 
     flash[:error] = 'Save error' 
    end 
    rescue ActiveRecord::NestedAttributes::TooManyRecords 
    flash[:error] = 'Too many records' 
    end 
end 
这里
6

我不知道任何内置的方法。尽管你可以添加你自己的验证程序。

validate :member_limit 

def member_limit 
    errors.add(:base, "You sir, have too many members!") if members.count > 25 
end 

这会给基础模型增加一个错误。我想你也可以添加误差超过25协会与members.errors.add(:base, "Sorry, no room for you.")

这里是引导阅读更多:

http://guides.rubyonrails.org/active_record_validations_callbacks.html#performing-custom-validations

+0

这是答案的最佳方法,因为它不仅检查当前请求的嵌套属性,还检查模型的现有嵌套属性。 –

5

您是否尝试过在嵌套属性限制选项?

accepts_nested_attributes_for :field, limit: 10 

您可以限制可以创建多少个嵌套关联。