在保存之前验证多个嵌套属性关联模型是不是相等
Posted
技术标签:
【中文标题】在保存之前验证多个嵌套属性关联模型是不是相等【英文标题】:Validate multiple nested attributes associated models for equality before saving在保存之前验证多个嵌套属性关联模型是否相等 【发布时间】:2014-09-25 14:54:26 【问题描述】:我有一个用 Rails 编写的媒体服务器,它允许用户上传图像并对其进行分类。 我现在正在制作相当复杂的情绪板功能。
首先,我们有一个Template
模型。这个Template
模型有很多TemplateBlocks
。
TemplateBlock
具有属性 width
、height
、top
、left
和 position
。选择这些是为了方便生成 css 代码和 pdf。 TemplateBlock
表还包含 template_id
的列。
接下来我们有一个Moodboard
,其中有很多Documents
到MoodboardImages
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_id
。 Moodboard
显然不能包含多个模板。
我对你们的问题是,我如何才能尽可能简洁地完成此验证?
我当然可以编写一个方法,从数据库中获取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 需要查询数据库以获取我认为关联的块?以上是关于在保存之前验证多个嵌套属性关联模型是不是相等的主要内容,如果未能解决你的问题,请参考以下文章