在保存之前验证多个嵌套属性关联模型是不是相等

Posted

技术标签:

【中文标题】在保存之前验证多个嵌套属性关联模型是不是相等【英文标题】:Validate multiple nested attributes associated models for equality before saving在保存之前验证多个嵌套属性关联模型是否相等 【发布时间】:2014-09-25 14:54:26 【问题描述】:

我有一个用 Rails 编写的媒体服务器,它允许用户上传图像并对其进行分类。 我现在正在制作相当复杂的情绪板功能。

首先,我们有一个Template 模型。这个Template 模型有很多TemplateBlocksTemplateBlock 具有属性 widthheighttopleftposition。选择这些是为了方便生成 css 代码和 pdf。 TemplateBlock 表还包含 template_id 的列。

接下来我们有一个Moodboard,其中有很多DocumentsMoodboardImages

class Moodboard < ActiveRecord::Base

   has_many :documents, through: :moodboard_images
   has_many :moodboard_images, dependent: :destroy

   accepts_nested_attributes_for :moodboard_images

end

MoodboardImages 表包含另外一列template_block_id,以确定Template 中的位置

现在一切正常,但我需要验证 MoodboardImage 创建。 当保存具有MoodboardImages 的嵌套属性的Moodboard 时,应该限制MoodboardImage 具有相同的template_idMoodboard 显然不能包含多个模板。

我对你们的问题是,我如何才能尽可能简洁地完成此验证?

我当然可以编写一个方法,从数据库中获取TemplateBlock 并临时存储并比较它before_save 或其他东西,但这并不漂亮。我想知道是否有“好”或“好”的方法来做到这一点。

【问题讨论】:

您的Moodboard 模型是什么样的?你可以在那里添加验证,不是吗? Moodboard 模型并不特殊,它只有一个名称列。这些关系构成了情绪板,我可以在 Moodboard 模型中添加验证,但它需要查询新的 MoodBoardImage 的 template_block_id 以确保 template_blocks 都具有相同的 template_id 【参考方案1】:

验证看起来像

validates :template_id, :uniqueness => :scope => :moodboard_id

参考rails guides

【讨论】:

template_id 不在 MoodBoardImage 模型上,模板 id 需要从关联的 TemplateBlock 中检索,因此为了使其工作,rails 需要查询数据库以获取我认为关联的块?

以上是关于在保存之前验证多个嵌套属性关联模型是不是相等的主要内容,如果未能解决你的问题,请参考以下文章

Rails 3:通过关联项验证是不是存在至少一个有多个

Laravel:一次保存多个模型/ json嵌套输入

有一个带有自动保存功能的 Rails 模型,我应该验证关联吗?

客户端验证不适用于重用和嵌套的复杂属性

验证一个对象是不是有一个或多个关联对象

如何在rails中禁用嵌套表单的服务器端验证