如何验证Ruby on Rails中相关字段的存在

时间:2014-09-18 07:06:22

标签: ruby-on-rails ruby

我有表格应用程序和业务。

Applications
  has_many :business

Business
  belongs_to :applications

如果我要创建Application,,我应该至少有一个Business。我在创建应用程序的相同表单中使用了link_to_add。

我使用了validate_association:applciations但它没有用。

3 个答案:

答案 0 :(得分:1)

可能更好地使用validates_associated

#app/models/business.rb
class Business < ActiveRecord::Base
   belongs_to :application
   validates :name, :other, param, presence: true
end

#app/models/application.rb
class Application < ActiveRecord::Base
   has_many :businesses
   validates_associated :businesses
end 

这使您能够检查通过模型传递的任何关联数据的有效性。但是,这不会确定是否至少有一个关联的business通过了您的模型。

-

数字验证

您需要查看the following

Rails中的reject_if方法无法检查已发送的关联项目的数量。这必须是自定义编码,上述帖子的作者通过设置自定义常量(2012年)解决了这个问题:

#app/models/company.rb
class Company < ActiveRecord::Base
  OFFICES_COUNT_MIN = 1

  validates :name, presence: true
  validate do
    check_offices_number
  end
  has_many :offices
  accepts_nested_attributes_for :offices, allow_destroy: true

  private

    def offices_count_valid?
      offices.count >= OFFICES_COUNT_MIN
    end

    def check_offices_number
      unless offices_count_valid?
        errors.add(:base, :offices_too_short, :count => OFFICES_COUNT_MIN)
      end
    end
end

我自己没有对此进行过测试,但为了解释它是如何工作的,你基本上会有一个自定义验证器,它允许你检查相关对象的数量是否小于或等于CONSTANT你在课堂上分配。

当然,您可以在没有常量的情况下实现此目的,但上面的示例应该演示如何创建至少 1关联项应该发送的功能

答案 1 :(得分:0)

不确定这是否是您的意思,但您可以在模型中执行以下操作,例如

  has_many :businesses, dependent: :destroy
  validates :title, presence: true

在另一个模型中:

  belongs_to :application  
  validates :name, presence: true

答案 2 :(得分:0)

您可以使用 validates_presence_of

验证指定的属性是否为空(由Object#blank定义?),如果属性是关联,则表明关联对象未标记为销毁。默认情况下会在保存时发生。

示例:

Applications
  has_many :businesses
  validates_presence_of :business

Business
  belongs_to :applications

更新

我认为您最好使用 accepts_nested_attributes_for

嵌套属性允许您通过associated recordsparent上保存属性。默认情况下,嵌套属性更新已关闭,您可以使用accepts_nested_attributes_for类方法启用它。启用嵌套属性时,将在模型上定义属性编写器。

应用/模型/ application.rb中

Class Application < ActiveRecord::Base
   has_many :businesses
   accepts_nested_attributes_for :businesses, reject_if: :all_blank
end

<强>#应用程序/模型/ business.rb

 Class Business < ActiveRecord::Base
       belongs_to :application
 end

这将使您能够调用reject_if: :all_blank方法 -

<强>:reject_if

允许您指定指向检查是否应为特定属性哈希构建记录的方法的Proc或Symbol。散列传递给提供的Proc或方法,它应该返回true或false。当no:reject_if被指定时,将为所有属性哈希构建一条记录,该哈希没有_destroy值,其值为true。传递:all_blank而不是Proc将创建一个proc,它将拒绝所有属性为空的记录,不包括_destroy的任何值。