Какой лучший способ проверить, является ли экземпляр модели «пустым» в Ruby on Rails? - PullRequest
0 голосов
/ 13 октября 2011

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

Я использовал вспомогательный метод, который удаляет ключ из Hashи вернуть оставшийся хеш ( вопрос 6227600 )

class ActiveRecord::Base
    def blank?
        self.attributes.remove("id","created_at","updated_at").reject{|attr| self[attr].blank?}.empty?
    end
end

Я полагаю, что может быть гораздо более простой, эффективный или безопасный способ сделать это.Любое предложение?

Ответы [ 2 ]

1 голос
/ 14 октября 2011
def blank?
  self.attributes.all?{|k,v| v.blank? || %w(id created_at updated_at).include?(k)}
end

Мой ответ почти такой же, как tadman , но выражается более кратко. Будьте осторожны с двумя ситуациями:

- ** пусто? ** не является хорошим выбором в качестве имени, поскольку, если вы вызовете ** object_a.object_b.blank? **, пытаясь узнать, есть ли object_b внутри object_a, вы получите true событие, если объект существует. ** пусто? ** кажется лучшим именем

- Если базы данных устанавливают значения по умолчанию, это может быть сложно.

РЕДАКТИРОВАТЬ: Так как сборка массива каждая итерация медленная ( спасибо tadman ), лучшее решение:

def empty?
  ignored_attrs = {'id' => 1, 'created_at' => 1, 'updated_at' => 1}
  self.attributes.all?{|k,v| v.blank? || ignored_attrs[k]}
end
0 голосов
/ 13 октября 2011

Вы можете просто проверить, что все свойства в хеше attributes отсутствуют, или наоборот:

class ActiveRecord::Base
  def blank?
    !self.attributes.find do |key, value| 
      case (key)
      when 'id', 'created_at', 'updated_at'
        false
      else
        value.present?
      end
    end
  end
end

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

Подобные вещи, вероятно, лучше всего реализовывать в каждом конкретном случае.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...