Joh*_*uff 5 validation activerecord nested ruby-on-rails associations
我有一个Rails模型的嵌套属性,并且关联验证由于某种原因失败.我没有使用accepts_nested_attributes_for,但我做的事情非常相似.
class Project < ActiveRecord::Base
has_many :project_attributes
def name
project_attributes.find_by_name("name")
end
def name=(val)
attribute = project_attributes.find_by_name("name")
if attribute
attribute.value = val
else
project_attributes.build(:name=>"name", :value=>val)
end
end
end
class ProjectAttribute < ActiveRecord::Base
belongs_to :project
validates_presence_of :name
validates_uniqueness_of :name, :scope => :project_id
validates_presence_of :project_id, :unless => lambda {|attribute| attribute.project.try(:valid?)}
validates_associated :project
end
Run Code Online (Sandbox Code Playgroud)
这是一个人为的例子,但与我想要做的类似.我已经看了一下accepts_nested_attributes_for做了什么,它使用了构建方法,我认为它会将构建的属性与项目相关联.
我还查看了accepts_nested_attributes_for子关联验证失败,这给了我validates_presence_of :unless=>valid?
有关如何使其工作的任何想法?
validates_associated看起来比它的价值更麻烦.如果删除validates_presence_of:project_id,则示例有效.这是一个恢复验证的hacky示例(在此处找到描述).
class ProjectAttribute < ActiveRecord::Base
belongs_to :project
validates_presence_of :name
validates_uniqueness_of :name, :scope => :project_id
validates_presence_of :project_id, :unless => Proc.new { |project_attribute|
project = project_attribute.project
ObjectSpace.each_object(Project) {|o| project = o if o.project_attributes.include?(project_attribute)} unless project
project
}
end
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
7995 次 |
最近记录: |