我有一个Media
模型,它有一个枚举
enum asset_type: { broadcast: 1, video: 2, audio: 3 }
和另一个称为CCD_ 2并与CCD_
has_many :medias, dependent: :destroy
accepts_nested_attributes_for :medias
我想添加每个Post
的限制,即资产类型audio
的一个media
,但我仍然想要多个broadcast
和video
。
我怎样才能做到这一点?
我不确定在给定枚举的情况下定义has_one
关系是否真的有意义。
如果您只需要在记录创建或更新时强制执行此操作,请考虑使用回调进行处理。
关于Post
:的一个例子
class Post
has_many :medias, dependent: :destroy
accepts_nested_attributes_for :medias
before_save :ensure_only_one_audio_media
...
private
def ensure_only_one_audio_media
errors.add(:medias, 'already has an audio media attached') if medias.where(asset_type: 3).size > 1
end
end
但是,根据您将媒体保存到帖子的方式,您可能需要在Media
上验证这一点。
如果你没有被锁定在当前模式中,并且真的想通过关系来实现这一点,那么最清晰的方法之一就是将音频分离为自己的对象。
class Post
has_many :medias, dependent: :destroy
has_one :audio
accepts_nested_attributes_for :medias, :audio
我认为这可能是一个很好的例子";设计用户体验以满足您的需求";。与其在型号和dB级别上制造一些安全隐患,不如确保你的用户没有机会在已经有音频媒体的帖子中添加更多音频媒体。本质上,我建议您可以在控制器和视图级别执行此操作,而无需更改任何现有代码。