Validations will fail if an AR model has an attribute (column) with the same name as a previously defined method (anywhere in the inheritance chain); and, if the attribute has not already been accessed.
The attached patch adds a test to illustrate the problem.
The problem is that AR uses respond_to? to check whether a validation should send(:attr) or use [:attr]. respond_to? is overridden to always return true for an attribute. send(:attr) is then used to invoke the method. If the attribute has already been accessed then we will hit the method correctly. Similarly, if the method hasn't been accessed and no other method exists with the same name, the method gets created by method_missing. If, however, we haven't accessed the attribute and another method exists with the same name, we will invoke that.
The test in the patch creates a private method on Object that requires one argument. This makes the failure more obvious (as you get a 'wrong number of arguments' error), although you'll still see a failure when removing that required argument.
I started to think about patching the code to fix the problem but started getting stuck as to the best approach. My initial thoughts were based around creating a send_public method that would replicate send but obey visibility. This was because my problem was caused by a private method on Object. Having written this description I'm pretty certain the same problem will be observed with public methods too.