简体   繁体   中英

Selecting all current attributes of a model for validations in Rails

When setting up my models I often find myself having to write out all of its attributes when setting up certain validations. A common example is when I use the presence parameter:

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

Is there a clever way to select all of its attributes without explicitly writing them all out similar to how you can retrieve them in the rails console?

User.columns

And pass it as an argument in the validates method?

ALL_ATTRIBUTES = User.columns

validates ALL_ATTRIBUTES, presence: true

Trying something like this out I got this error undefined method 'to_sym'

I will NOT encourage you or anyone to do this. Reason being when you run into issues, when an object of your model doesn't get saved and throw errors because of a new column which was added to application after some time in future, and you or new developers will wonder WHY?!?!.

However, if you must do then here you go:

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

Here, * in Ruby is known as splat operator and here's the explanation on &: .

This is an awful idea. But you can do it this way:

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

Why is it a bad idea? Because it's not very clear what is being validated it. It makes debugging hard, and could cause you have strange bugs. If you add a column in the future that does not require presence validation, you will trip up. Also, some things my not require presence. For example, an email field will need a regex validation, which automatically knows that a blank string is invalid. So a presence validator is redundant.

Beware of being too clever , as it's sometimes not so clever after all.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM