-
Notifications
You must be signed in to change notification settings - Fork 34
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Support case-insensitive uniqueness validations under MySQL #39
base: master
Are you sure you want to change the base?
Conversation
In MySQL individual columns can be case-insensitive, according to their collation type qualifier, without regard to any index. Rails already provides a case_sensitive? method on columns via the AbstractMysqlAdapter module.
…lation. When determining whether a uniqueness validation should be case insensitive, we only want to consider the column's own reported case-sensitivity if it is a true property of the column, i.e., due to its collation/character set. The schema_plus_columns gem monkey patches in its own version of case_sensitive?, for PostgreSQL, that determines this based upon the properties of ANY indexes in which the column participates. That method does NOT correctly take into account the index scope. Since in PostgreSQL it is possible to have a column participate in two indexes, one being case-sensitive and another being case-insensitive, it is important to always consider the scope. This does not matter with MySQL.
Old text implied case-insensitivity is only supported with that gem. But now MySQL case-insensitive validations will work without any extra gems.
Thanks for the PR. Good catch regarding
Schema_dev adds the ability for you to specify, e.g.
schema_plus_views/spec/named_schemas_spec.rb also has examples of creating schemas via If you can fit it into validations_spec.rb i guess that'd be best, otherwise it could be in a separate file. I actually don't like validations_spec's setup of having one big ugly schema shared by all tests; each test or context should define a small schema containing just the bits that are needed for that specific test. This big-ugly-schema style is legacy code that I've been gradually moving away from in the schema plus family. So you shouldn't feel the need to shoehorn the collation stuff into that big schema, just define something specific to the new the case(s) you're testing.
That seems like a natural thing for schema_plus_columns to add! I'll open up an issue there for that too. Thanks again for taking the time with this! |
This is a proposed fix for issue #38
I'm not sure how to proceed writing a test spec for this. It should only be run with against a MySQL database, and furthermore may require creating a table using raw SQL (execute) rather than as a rails schema migration/load; because a proper test will rely on the MySQL
COLLATION
type qualifier which is not exposed by the schema loader/dumper (though it is a read-only property of the Column type).The example code presented in the issue would probably serve as a good basis for a test.