2014-10-04 6 views
0

При настройке моих моделей мне часто приходится записывать все свои атрибуты при настройке определенных валидаций. Типичным примером является, когда я использую presence параметр:Выбор всех текущих атрибутов модели для валидации в Rails

validates :first_name, :last_name, :username, :email, presence: true

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

User.columns

И передать его в качестве аргумента в метод проверяет?

ALL_ATTRIBUTES = User.columns 

validates ALL_ATTRIBUTES, presence: true 

Пытаясь что-то подобное, что я получил эту ошибку undefined method 'to_sym'

ответ

2

Я НЕ рекомендую вам или кому-либо сделать это. Причина в том, что когда вы сталкиваетесь с проблемами, когда объект вашей модели не сохраняется и выбрасывает ошибки из-за нового столбца, который был добавлен в приложение через некоторое время в будущем, и вы или новые разработчики зададите себе вопрос ПОЧЕМУ?!?! ,

Однако, если вы должны сделать, то здесь вы идете:

validates *self.column_names.map(&:to_sym), presence: true 

Здесь * в Рубине известен как splat operator и here's the explanation on &:.

+0

Спасибо за предупреждение, и да, похоже, это делает трюк. Всего несколько вопросов. Почему перед '' '' перед '' и '&:' перед преобразованием атрибутов в символы? –

+0

@CarlEdwards 'column_names.map (&: to_sym)' является сокращением для 'column_names.map {| column | column.to_sym} '. Если вы вызываете метод только для атрибутов, вы можете сократить использование '&: to_sym'. Это синтаксический сахар. – Mohamad

+0

@CarlEdwards: добавлено объяснение ваших сомнений. Если ответ поможет, пожалуйста, примите его, чтобы другие могли использовать его для справки. Благодарю. – Surya

1

Это ужасная идея. Но вы можете сделать это так:

attrs = column_names.map { |column| column.to_sym } 
validates *attrs, presence: true 

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

Остерегайтесь быть слишком умным, так как иногда это не так умно.

+0

Я получил это: 'undefined method 'to_sym' для [: id,: name,: position,: visible,: created_at,: updated_at]: Array' –

Смежные вопросы