Как проверить виртуальный атрибут в модели ActiveRecord? - PullRequest
3 голосов
/ 13 июля 2009

Я использую виртуальные атрибуты для сохранения тегов в модели Entry из разделенного запятыми текстового поля в моей форме (на основе Railscasts # 167 ):

class Entry < ActiveRecord::Base
  has_many :entry_tags
  has_many :tags, :through => :entry_tags

  after_save :update_tags
  attr_writer :tag_names

  def tag_names
    tags.map(&:name).join(", ")
  end

  def update_tags
    if @tag_names
      self.tags = @tag_names.split(",").map do |name|
        Tag.find_or_create_by_name(name.strip)
      end
    end
  end
  private :update_tags
end

Я хочу добавить проверку для своих имен тегов, но я не уверен, что лучший способ сделать это. У меня есть существующий метод проверки, определенный в модели тегов:

class Tag < ActiveRecord::Base
  has_many :entry_tags
  has_many :entries, :through => :entry_tags

  validates_uniqueness_of :name
  validates_format_of :name, :with => /\A[a-z0-9_ -]*\Z/, :on => :create
end

Однако, поскольку метод update_tags вызывается после сохранения, любые ошибки проверки при создании будут возникать после того, как запись уже сохранена.

Я думаю о создании метода проверки в модели Entry и вызове его при сохранении записи, но:

  1. Если я сделаю это, я не уверен, каким будет лучший способ проверки. Должен ли я создать свою собственную проверку в Entry или создать объект Tag для каждого имени и поставить галочку t.valid?? Буду ли я каким-либо образом получать сообщения об ошибках валидации от Tag или генерировать их?
  2. Я не уверен, что это даже правильный способ сделать такую ​​проверку.

Есть предложения?

Ответы [ 2 ]

3 голосов
/ 14 июля 2009

Если вы еще не исключили это, я бы посмотрел на использование validates_associated.

0 голосов
/ 24 июня 2013

Эта ошибка появляется при попытке добавить недопустимый элемент в ассоциацию. Возможная причина заключается в том, что вы добавили проверку в связанную модель после ввода данных, и в настоящее время в базе данных есть недопустимые значения.

...