我有表格应用程序和业务。
Applications
has_many :business
Business
belongs_to :applications
如果我要创建Application,
,我应该至少有一个Business
。我在创建应用程序的相同表单中使用了link_to_add。
我使用了validate_association:applciations但它没有用。
答案 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 records
在parent
上保存属性。默认情况下,嵌套属性更新已关闭,您可以使用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的任何值。