Как применить другое правило валидации в соответствии с типом полиморфной ассоциации (Rails)? - PullRequest
3 голосов
/ 10 июля 2010

У меня есть полиморфная модель Rails, и я хочу применить различные проверки в соответствии с ассоциированным классом .

Ответы [ 2 ]

3 голосов
/ 10 июля 2010

Имя класса находится в столбце _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

ИЛИ, и я думаю, что мне нравится это лучше:

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 голос
/ 26 января 2017

Метод 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
...