Ruby on rails Rails接受\u嵌套的\u属性计数验证

Ruby on rails Rails接受\u嵌套的\u属性计数验证,ruby-on-rails,ruby-on-rails-3,activerecord,activemodel,Ruby On Rails,Ruby On Rails 3,Activerecord,Activemodel,我有三个模型。销售、项目和图像。我想确认创建销售时,每笔销售至少有三张照片和一个或多个项目。实现这一目标的最佳方式是什么 销售模式: class Sale < ActiveRecord::Base has_many :items, :dependent => :destroy has_many :images, :through => :items accepts_nested_attributes_for :items, :reject_if =>

我有三个模型。销售、项目和图像。我想确认创建销售时,每笔销售至少有三张照片和一个或多个项目。实现这一目标的最佳方式是什么

销售模式:

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 Sale:销毁
有多个:图像,:至=>:项
接受:items的_嵌套的_属性,:reject_if=>lambda{a | a[:title]。blank?},:allow_destroy=>true
结束
项目模型:

class Item < ActiveRecord::Base

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

  accepts_nested_attributes_for :images

end
class项:destroy
有许多:映像,:依赖=>:销毁
接受图像的\u嵌套\u属性\u
结束
图像模型:

class Image < ActiveRecord::Base
  belongs_to :item, :dependent => :destroy
end
类映像:销毁
结束

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

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

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:validate\u item\u count,:validate\u image\u count
def验证项目计数
如果self.items.size<1
错误。添加(:项,“需要1个或多个项”)
结束
结束
def验证图像计数
如果self.items.images.size<3
错误。添加(:图像,“至少需要3个图像”)
结束
结束

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

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

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
class Sale

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

理想情况下,将这些方法命名为validate\u item\u count和validate\u image\u count,因为这会澄清您的意图,并且这些方法会添加错误。嗯,这对我创建新记录不起作用。啊,别担心。我从嵌套的第三层属性查询ActiveRecord关联。通过查询初始嵌套的_属性来实现它。@alex很高兴9年后,这仍然对人们有用:)@DonavanWhite绝对!