【问题标题】:Rails accepts_nested_attributes count validationRails 接受_nested_attributes_for 计数验证
【发布时间】:2012-03-29 19:50:40
【问题描述】:

我有三个模型。销售、物品和图像。我想验证在创建销售时,每次销售至少有三张照片和一件或多件商品。实现这一目标的最佳方法是什么?

销售模式:

class Sale < ActiveRecord::Base
   has_many :items, :dependent => :destroy
   has_many :images, :through => :items

   accepts_nested_attributes_for :items, :reject_if => lambda { |a| a[:title].blank? }, :allow_destroy => true
end

物品型号:

class Item < ActiveRecord::Base

  belongs_to :sale, :dependent => :destroy
  has_many :images, :dependent => :destroy

  accepts_nested_attributes_for :images

end

图像模型:

class Image < ActiveRecord::Base
  belongs_to :item, :dependent => :destroy
end

【问题讨论】:

    标签: ruby-on-rails ruby-on-rails-3 activerecord activemodel


    【解决方案1】:

    创建用于验证的自定义方法

    在您的销售模型中添加如下内容:

    validate :validate_item_count, :validate_image_count
    
    def validate_item_count
      if self.items.size < 1
        errors.add(:items, "Need 1 or more items")
      end
    end
    
    def validate_image_count
      if self.items.images.size < 3
        errors.add(:images, "Need at least 3 images")
      end
    end
    

    希望这对您有所帮助,祝您好运,编码愉快。

    【讨论】:

    • 最好将这些方法命名为 validate_item_count 和 validate_image_count,因为这样可以阐明您的意图并且这些方法会增加错误。
    • 嗯,这对我创建新记录不起作用。
    • 啊,别担心。我正在从嵌套属性的 第三层 层查询 ActiveRecord 关联。通过查询初始的nested_attributes 让它工作。
    • @alex 9 年后很高兴,这仍然对人们有帮助:)
    • @DonavanWhite 绝对!
    【解决方案2】:

    另一个选择是将这个小技巧与length 验证一起使用。尽管大多数示例显示它与文本一起使用,但它也会检查关联的长度:

    class Sale < ActiveRecord::Base
       has_many :items,  dependent: :destroy
       has_many :images, through: :items
    
       validates :items,  length: { minimum: 1, too_short: "%{count} item minimum" }
       validates :images, length: { minimum: 3, too_short: "%{count} image minimum" }
    end
    

    您只需要提供自己的消息,因为默认消息会提到字符数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-02-03
      • 1970-01-01
      • 1970-01-01
      • 2011-03-04
      • 2023-04-10
      • 1970-01-01
      • 2013-12-24
      相关资源
      最近更新 更多