Как мне изменить ActiveRecord с помеченного на сохранение, чтобы убедиться, что он не сохраняется из самой модели? - PullRequest
0 голосов
/ 04 октября 2011

Как мне изменить AcriveRecord с помеченного на сохранение, чтобы убедиться, что он не сохраняется из самой модели?

Учитывая, что я могу запустить метод с помощью ловушки в activerecord, например: before_save

для (гипотетического) примера:

before_save :ignore_new_delete_exisiting_if_blank(self.attribute)

def ignore_new_delete_exisiting_if_blank(attribute)
  self.do_not_save_me! if attribute.blank?

  #what is that magic "do_not_save_me" method? 
  #Is there such thing, or something to achieve the same thing?
end

Обновление

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

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

Ответы [ 2 ]

2 голосов
/ 04 октября 2011

Ваш метод должен просто возвращать false, чтобы он не сохранялся.Или вы устанавливаете ошибки, которые будут более информативными.

Например:

def ignore_new_delete_exisiting_if_blank_attribute
  if attribute.blank?
    errors.add(:base, "Not allowed to save if attribute is blank.")
  end
end

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

validates_presence_of :attribute

[ОБНОВЛЕНИЕ]

При сохранении родительской модели с детьми, у вас естьсделать что-то вроде accepts_nested_attributes_for, и в этом вызове вы можете указать, какие атрибуты должны быть заданы или когда дочерняя запись игнорируется.

Например

accepts_nested_attributes_for :posts, :reject_if => proc { |attributes| attributes['title'].blank? }

не сохранит сообщение, если заголовок будет пустым.

Надеюсь, это поможет.

1 голос
/ 04 октября 2011

"Волшебство" заключается в том, что когда вы возвращаете false из метода, запись не будет сохранена.

В вашем случае:

def ignore_new_delete_exisiting_if_blank(attribute)
  attribute.present?
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...