我有Rails多态模型,我想根据关联的类应用不同的验证。如何根据多态关联类型(Rails)应用不同的验证规则?
3
A
回答
3
类名是在以下设置为实例的_type
柱:
class Comment
belongs_to :commentable, :polymorphic => true
end
class Post
has_many :comments, :as => :commentable
end
评论类将有commentable_id
和commentable_type
领域。 commentable_type
是类名,commentable_id
是外键。如果通过特定的后留言评论要到验证,你可以做这样的事情:
validate :post_comments_are_long_enough
def post_comments_are_long_enough
if self.commentable_type == "Post" && self.body.size < 10
@errors.add_to_base "Comment should be 10 characters"
end
end
OR,我觉得这个比较好:
validates_length_of :body, :mimimum => 10, :if => :is_post?
def is_post?
self.commentable_type == "Post"
end
如果你有几个验证,我会推荐以下语法:
with_options :if => :is_post? do |o|
o.validates_length_of :body, :minimum => 10
o.validates_length_of :body, :maximum => 100
end
1
validates_associated方法是你所需要的。 您只需将此方法链接到多态模型,它将检查相关模型是否有效。
class Comment < ActiveRecord::Base
belongs_to :commentable, :polymorphic => true
validates_associated :commentable
end
class Post < ActiveRecord::Base
has_many :comments, as: commentable
validates_length_of :body, :minimum => 10
validates_length_of :body, :maximum => 100
end
+0
我得到这个错误undefined method'body 'for – 2017-11-08 17:05:39
+0
@KickButtowski也许是因为你的模型没有属性'body'? – Guillaume 2017-11-29 16:27:06
相关问题
- 1. 多态性关联验证?
- 2. 验证多态关联
- 3. 如何应用关联规则
- 4. Rails关联 - 如何为不同类型的用户设置关联?
- 5. Rails 3:将相同的验证规则应用于多个表字段
- 6. 验证多态关联模型中的作用域唯一性
- 7. 根据规则动态地执行验证
- 8. 不同的验证规则JSF
- 9. 如何验证关联的模型?
- 10. 如何使用jQuery验证具有多个验证规则集
- 11. 跳过对rails中多态关联的验证
- 12. 将Sitecore验证规则应用于字段类型?
- 13. Rails的多态关联,二assoc命令类型的一类
- 14. 验证应用程序块的对象验证不规则集
- 15. 验证形式与多态关联
- 16. 验证多对多关联
- 17. 如何使用CakePHP验证而不必定义模型验证规则?
- 18. 关联规则
- 19. 使用的多个验证规则
- 20. Firebase规则验证数据
- 21. 在Rails 2中使用不同的has_one关联加载多态关联
- 22. Rails的多态关联accepts_nested_attributes
- 23. Rails的:多态关联
- 24. Rails中的多态关联
- 25. 如何验证Rails 3关系模型?
- 26. Yii2:如何动态地将验证规则添加到模型类中?
- 27. 如何处理RIA服务中的不同验证规则?
- 28. 验证不检查规则
- 29. 验证规则不工作
- 30. 规则不进行验证
这是低劣的部分。无法从多态模型中访问属性。 “未定义的方法'itemable_type'为#” –
BlackTea
2010-07-10 13:44:16
生活将是完美的,否则...... :( – BlackTea 2010-07-10 13:50:13
如果您将上面的代码直接写入您的课程将会失败,它只能用于实例,而不是类。将'define_method'代码添加到实例方法中,并且它应该通过。 – 2010-07-10 14:53:50