【问题标题】:How to limit number of nested attributes for a model in rails如何限制rails中模型的嵌套属性数量
【发布时间】:2013-01-16 18:41:26
【问题描述】:

我有两个相关的模型:Group 和 Member。

组.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. 我在浏览器端添加了 8 个来自 FORM 的成员

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

rails 中是否有任何内置方法可以做到这一点。作为 Rails 的新手,我不知道这一点??

【问题讨论】:

标签: ruby-on-rails-3 validation limit nested-attributes


【解决方案1】:

在你的模型中:

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

【讨论】:

    【解决方案2】:

    我也不知道任何内置方法。不过,您可以添加自己的验证例程。

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

    这会向基本模型添加一个错误。我认为您还可以使用 members.errors.add(:base, "Sorry, no room for you.") 向 25 以上的关联添加错误

    这里是阅读指南:

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

    【讨论】:

    • 这是最好的答案方法,因为它不仅检查当前请求的嵌套属性,还检查模型已经存在的嵌套属性。
    【解决方案3】:

    您是否尝试过对嵌套属性使用限制选项?

        accepts_nested_attributes_for :field, limit: 10
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多