No Reservations about Keywords in Ruby on Rails
Posted by Daniel Butler Wed, 31 Jan 2007 21:05:00 GMT

Have you ever had the urge to name a data model in your Ruby on Rails application something obvious, like Action, Table, File, Columns, or Database? Well, don’t. Choosing a name like that might work for you in some cases, but it might fail miserably for someone else using a different database engine (i.e., MySQL verses PostgreSQL verses Oracle).
Think you can remember all the problematic names? Think again. There are at least 974 known keywords which can give you problems. I started with the ReservedWords pages on the Ruby on Rails Wiki, and pulled in and merged all the SQL-92, SQL-99, SQL-2003, PostgreSQL, MySQL, SQL Server and ODBC reserved keywords, and put them in one place, mainly for my own future reference.
So what if your data models are about Databases, Tables, Columns, and Files? Simply think of a Good Prefix™, and name all your models accordingly: DaDatabase, DaTable, DaColumn, and DaFile, with resulting table named da_databases, da_tables, da_columns, and da_files. It’s easy, painless, and helps you group similarly-purposed tables and models accordingly, and you don’t have to wrack your brains thinking of synonyms for obvious model names like “Action”. I use Geo- for location-oriented data, Sys- for System-oriented tables, Log- for transactions, and App- for application-oriented tables.
Read on to see the full list …
Reserved Words in Ruby on Rails
ADDITIONAL_LOAD_PATHS, ARGF, ARGV, ActionController, ActionView, ActiveRecord, ArgumentError, Array, BasicSocket, Benchmark, Bignum, Binding, CGI0, CGIMethods, CROSS_COMPILING, Class, ClassInheritableAttributes, Comparable, ConditionVariable, Config, Continuation, DRb, DRbIdConv, DRbObject, DRbUndumped, Data, Date, DateTime, Delegater, Delegator, Digest, Dir, ENV, EOFError, ERB, Enumerable, Errno, Exception, FALSE, FalseClass, Fcntl, File, FileList, FileTask, FileTest, FileUtils, Fixnum, Float, FloatDomainError, GC, Gem, GetoptLong, Hash, IO, IOError, IPSocket, IPsocket, IndexError, Inflector, Integer, Interrupt, Kernel, LN_SUPPORTED, LoadError, LocalJumpError, Logger, Marshal, MatchData, MatchingData, Math, Method, Module, Mutex, Mysql, MysqlError, MysqlField, MysqlRes, NIL, NameError, NilClass, NoMemoryError, NoMethodError, NoWrite, NotImplementedError, Numeric, OPT_TABLE, Object, ObjectSpace, Observable, Observer, PGError, PGconn, PGlarge, PGresult, PLATFORM, PStore, ParseDate, Precision, Proc, Process, Queue, RAKEVERSION, RELEASE_DATE, RUBY, RUBY_PLATFORM, RUBY_RELEASE_DATE, RUBY_VERSION, Rake, RakeApp, RakeFileUtils, Range, RangeError, Rational, Regexp, RegexpError, Request, RuntimeError, STDERR, STDIN, STDOUT, ScanError, ScriptError, SecurityError, Signal, SignalException, SimpleDelegater, SimpleDelegator, Singleton, SizedQueue, Socket, SocketError, StandardError, String, StringScanner, Struct, Symbol, SyntaxError, SystemCallError, SystemExit, SystemStackError, TCPServer, TCPSocket, TCPserver, TCPsocket, TOPLEVEL_BINDING, TRUE, Task, Text, Thread, ThreadError, ThreadGroup, Time, Transaction, TrueClass, TypeError, UDPSocket, UDPsocket, UNIXServer, UNIXSocket, UNIXserver, UNIXsocket, UnboundMethod, Url, VERSION, Verbose, YAML0, ZeroDivisionError
Other Problematic Names
action, attributes, application, @base_path, connection, dispatcher, display, format, key, layout, load, link, new, notify, open, quote, render, request, records, responses, send, session, system, template, test, timeout, to_s, type, URI, Observer
Magic Field Names
created_at, created_on, updated_at, updated_on, lock_version, type, id, #{table_name}_count, position, parent_id, lft, rgt, quote, template
Reserved Words for Various SQL Databases
A, ABORT, ABS, ABSOLUTE, ACCESS, ACTION, ADA, ADD, ADMIN, AFTER, AGGREGATE, ALIAS, ALL, ALLOCATE, ALSO, ALTER, ALWAYS, ANALYSE, ANALYZE, AND, ANY, ARE, ARRAY, AS, ASC, ASENSITIVE, ASSERTION, ASSIGNMENT, ASYMMETRIC, AT, ATOMIC, ATTRIBUTE, ATTRIBUTES, AUTHORIZATION, AVG, BACKUP, BACKWARD, BEFORE, BEGIN, BERNOULLI, BETWEEN, BIGINT, BINARY, BIT, BITVAR, BIT_LENGTH, BLOB, BOOLEAN, BOTH, BREADTH, BREAK, BROWSE, BULK, BY, C, CACHE, CALL, CALLED, CARDINALITY, CASCADE, CASCADED, CASE, CAST, CATALOG, CATALOG_NAME, CEIL, CEILING, CHAIN, CHANGE, CHAR, CHARACTER, CHARACTERISTICS, CHARACTERS, CHARACTER_LENGTH, CHARACTER_SET_CATALOG, CHARACTER_SET_NAME, CHARACTER_SET_SCHEMA, CHAR_LENGTH, CHECK, CHECKED, CHECKPOINT, CLASS, CLASS_ORIGIN, CLOB, CLOSE, CLUSTER, CLUSTERED, COALESCE, COBOL, COLLATE, COLLATION, COLLATION_CATALOG, COLLATION_NAME, COLLATION_SCHEMA, COLLECT, COLUMN, COLUMN_NAME, COMMAND_FUNCTION, COMMAND_FUNCTION_CODE, COMMENT, COMMIT, COMMITTED, COMPLETION, COMPUTE, CONCURRENTLY, CONDITION, CONDITION_NUMBER, CONNECT, CONNECTION, CONNECTION_NAME, CONSTRAINT, CONSTRAINTS, CONSTRAINT_CATALOG, CONSTRAINT_NAME, CONSTRAINT_SCHEMA, CONSTRUCTOR, CONTAINS, CONTAINSTABLE, CONTINUE, CONVERSION, CONVERT, COPY, CORR, CORRESPONDING, COUNT, COVAR_POP, COVAR_SAMP, CREATE, CREATEDB, CREATEROLE, CREATEUSER, CROSS, CSV, CUBE, CUME_DIST, CURRENT, CURRENT_DATE, CURRENT_DEFAULT_TRANSFORM_GROUP, CURRENT_PATH, CURRENT_ROLE, CURRENT_TIME, CURRENT_TIMESTAMP, CURRENT_TRANSFORM_GROUP_FOR_TYPE, CURRENT_USER, CURSOR, CURSOR_NAME, CYCLE, DATA, DATABASE, DATABASES, DATE, DATETIME_INTERVAL_CODE, DATETIME_INTERVAL_PRECISION, DAY, DAY_HOUR, DAY_MICROSECOND, DAY_MINUTE, DAY_SECOND, DBCC, DEALLOCATE, DEC, DECIMAL, DECLARE, DEFAULT, DEFAULTS, DEFERRABLE, DEFERRED, DEFINED, DEFINER, DEGREE, DELAYED, DELETE, DELIMITER, DELIMITERS, DENSE_RANK, DENY, DEPTH, DEREF, DERIVED, DESC, DESCRIBE, DESCRIPTOR, DESTROY, DESTRUCTOR, DETERMINISTIC, DIAGNOSTICS, DICTIONARY, DISABLE, DISCONNECT, DISK, DISPATCH, DISTINCT, DISTINCTROW, DISTRIBUTED, DIV, DO, DOMAIN, DOUBLE, DROP, DUAL, DUMMY, DUMP, DYNAMIC, DYNAMIC_FUNCTION, DYNAMIC_FUNCTION_CODE, EACH, ELEMENT, ELSE, ELSEIF, ENABLE, ENCLOSED, ENCODING, ENCRYPTED, END, END-EXEC, EQUALS, ERRLVL, ESCAPE, ESCAPED, EVERY, EXCEPT, EXCEPTION, EXCLUDE, EXCLUDING, EXCLUSIVE, EXEC, EXECUTE, EXISTING, EXISTS, EXIT, EXP, EXPLAIN, EXTERNAL, EXTRACT, FALSE, FETCH, FILE, FILLFACTOR, FILTER, FINAL, FIRST, FLOAT, FLOAT4, FLOAT8, FLOOR, FOLLOWING, FOR, FORCE, FOREIGN, FORTRAN, FORWARD, FOUND, FREE, FREETEXT, FREETEXTTABLE, FREEZE, FROM, FULL, FULLTEXT, FUNCTION, FUSION, G, GENERAL, GENERATED, GET, GLOBAL, GO, GOTO, GRANT, GRANTED, GREATEST, GROUP, GROUPING, HANDLER, HAVING, HEADER, HIERARCHY, HIGH_PRIORITY, HOLD, HOLDLOCK, HOST, HOUR, HOUR_MICROSECOND, HOUR_MINUTE, HOUR_SECOND, IDENTITY, IDENTITYCOL, IDENTITY_INSERT, IF, IGNORE, ILIKE, IMMEDIATE, IMMUTABLE, IMPLEMENTATION, IMPLICIT, IN, INCLUDE, INCLUDING, INCREMENT, INDEX, INDEXES, INDICATOR, INFILE, INFIX, INHERIT, INHERITS, INITIALIZE, INITIALLY, INNER, INOUT, INPUT, INSENSITIVE, INSERT, INSTANCE, INSTANTIABLE, INSTEAD, INT, INT1, INT2, INT3, INT4, INT8, INTEGER, INTERSECT, INTERSECTION, INTERVAL, INTO, INVOKER, IS, ISNULL, ISOLATION, ITERATE, JOIN, K, KEY, KEYS, KEY_MEMBER, KEY_TYPE, KILL, LANCOMPILER, LANGUAGE, LARGE, LAST, LATERAL, LEADING, LEAST, LEAVE, LEFT, LENGTH, LESS, LEVEL, LIKE, LIMIT, LINENO, LINES, LISTEN, LN, LOAD, LOCAL, LOCALTIME, LOCALTIMESTAMP, LOCATION, LOCATOR, LOCK, LOGIN, LONG, LONGBLOB, LONGTEXT, LOOP, LOWER, LOW_PRIORITY, M, MAP, MATCH, MATCHED, MAX, MAXVALUE, MEDIUMBLOB, MEDIUMINT, MEDIUMTEXT, MEMBER, MERGE, MESSAGE_LENGTH, MESSAGE_OCTET_LENGTH, MESSAGE_TEXT, METHOD, MIDDLEINT, MIN, MINUTE, MINUTE_MICROSECOND, MINUTE_SECOND, MINVALUE, MOD, MODE, MODIFIES, MODIFY, MODULE, MONTH, MORE, MOVE, MULTISET, MUMPS, NAME, NAMES, NATIONAL, NATURAL, NCHAR, NCLOB, NESTING, NEW, NEXT, NO, NOCHECK, NOCREATEDB, NOCREATEROLE, NOCREATEUSER, NOINHERIT, NOLOGIN, NONCLUSTERED, NONE, NORMALIZE, NORMALIZED, NOSUPERUSER, NOT, NOTHING, NOTIFY, NOTNULL, NOWAIT, NO_WRITE_TO_BINLOG, NULL, NULLABLE, NULLIF, NULLS, NUMBER, NUMERIC, OBJECT, OCTETS, OCTET_LENGTH, OF, OFF, OFFSET, OFFSETS, OIDS, OLD, ON, ONLY, OPEN, OPENDATASOURCE, OPENQUERY, OPENROWSET, OPENXML, OPERATION, OPERATOR, OPTIMIZE, OPTION, OPTIONALLY, OPTIONS, OR, ORDER, ORDERING, ORDINALITY, OTHERS, OUT, OUTER, OUTFILE, OUTPUT, OVER, OVERLAPS, OVERLAY, OVERRIDING, OWNED, OWNER, PAD, PARAMETER, PARAMETERS, PARAMETER_MODE, PARAMETER_NAME, PARAMETER_ORDINAL_POSITION, PARAMETER_SPECIFIC_CATALOG, PARAMETER_SPECIFIC_NAME, PARAMETER_SPECIFIC_SCHEMA, PARTIAL, PARTITION, PASCAL, PASSWORD, PATH, PERCENT, PERCENTILE_CONT, PERCENTILE_DISC, PERCENT_RANK, PLACING, PLAN, PLI, POSITION, POSTFIX, POWER, PRECEDING, PRECISION, PREFIX, PREORDER, PREPARE, PREPARED, PRESERVE, PRIMARY, PRINT, PRIOR, PRIVILEGES, PROC, PROCEDURAL, PROCEDURE, PUBLIC, PURGE, QUOTE, RAID0, RAISERROR, RANGE, RANK, READ, READS, READTEXT, REAL, REASSIGN, RECHECK, RECONFIGURE, RECURSIVE, REF, REFERENCES, REFERENCING, REGEXP, REGR_AVGX, REGR_AVGY, REGR_COUNT, REGR_INTERCEPT, REGR_R2, REGR_SLOPE, REGR_SXX, REGR_SXY, REGR_SYY, REINDEX, RELATIVE, RELEASE, RENAME, REPEAT, REPEATABLE, REPLACE, REPLICATION, REQUIRE, RESET, RESIGNAL, RESTART, RESTORE, RESTRICT, RESULT, RETURN, RETURNED_CARDINALITY, RETURNED_LENGTH, RETURNED_OCTET_LENGTH, RETURNED_SQLSTATE, RETURNING, RETURNS, REVOKE, RIGHT, RLIKE, ROLE, ROLLBACK, ROLLUP, ROUTINE, ROUTINE_CATALOG, ROUTINE_NAME, ROUTINE_SCHEMA, ROW, ROWCOUNT, ROWGUIDCOL, ROWS, ROW_COUNT, ROW_NUMBER, RULE, SAVE, SAVEPOINT, SCALE, SCHEMA, SCHEMAS, SCHEMA_NAME, SCOPE, SCOPE_CATALOG, SCOPE_NAME, SCOPE_SCHEMA, SCROLL, SEARCH, SECOND, SECOND_MICROSECOND, SECTION, SECURITY, SELECT, SELF, SENSITIVE, SEPARATOR, SEQUENCE, SERIALIZABLE, SERVER_NAME, SESSION, SESSION_USER, SET, SETOF, SETS, SETUSER, SHARE, SHOW, SHUTDOWN, SIGNAL, SIMILAR, SIMPLE, SIZE, SMALLINT, SOME, SONAME, SOURCE, SPACE, SPATIAL, SPECIFIC, SPECIFICTYPE, SPECIFIC_NAME, SQL, SQLCA, SQLCODE, SQLERROR, SQLEXCEPTION, SQLSTATE, SQLWARNING, SQL_BIG_RESULT, SQL_CALC_FOUND_ROWS, SQL_SMALL_RESULT, SQRT, SSL, STABLE, START, STARTING, STATE, STATEMENT, STATIC, STATISTICS, STDDEV_POP, STDDEV_SAMP, STDIN, STDOUT, STORAGE, STRAIGHT_JOIN, STRICT, STRUCTURE, STYLE, SUBCLASS_ORIGIN, SUBLIST, SUBMULTISET, SUBSTRING, SUM, SUPERUSER, SYMMETRIC, SYSID, SYSTEM, SYSTEM_USER, TABLE, TABLESAMPLE, TABLESPACE, TABLE_NAME, TEMP, TEMPLATE, TEMPORARY, TERMINATE, TERMINATED, TEXTSIZE, THAN, THEN, TIES, TIME, TIMESTAMP, TIMEZONE_HOUR, TIMEZONE_MINUTE, TINYBLOB, TINYINT, TINYTEXT, TO, TOP, TOP_LEVEL_COUNT, TRAILING, TRAN, TRANSACTION, TRANSACTIONS_COMMITTED, TRANSACTIONS_ROLLED_BACK, TRANSACTION_ACTIVE, TRANSFORM, TRANSFORMS, TRANSLATE, TRANSLATION, TREAT, TRIGGER, TRIGGER_CATALOG, TRIGGER_NAME, TRIGGER_SCHEMA, TRIM, TRUE, TRUNCATE, TRUSTED, TSEQUAL, TYPE, UESCAPE, UNBOUNDED, UNCOMMITTED, UNDER, UNDO, UNENCRYPTED, UNION, UNIQUE, UNKNOWN, UNLISTEN, UNLOCK, UNNAMED, UNNEST, UNSIGNED, UNTIL, UPDATE, UPDATETEXT, UPPER, USAGE, USE, USER, USER_DEFINED_TYPE_CATALOG, USER_DEFINED_TYPE_CODE, USER_DEFINED_TYPE_NAME, USER_DEFINED_TYPE_SCHEMA, USING, UTC_DATE, UTC_TIME, UTC_TIMESTAMP, VACUUM, VALID, VALIDATOR, VALUE, VALUES, VARBINARY, VARCHAR, VARCHARACTER, VARIABLE, VARYING, VAR_POP, VAR_SAMP, VERBOSE, VIEW, VOLATILE, WAITFOR, WHEN, WHENEVER, WHERE, WHILE, WIDTH_BUCKET, WINDOW, WITH, WITHIN, WITHOUT, WORK, WRITE, WRITETEXT, X509, XOR, YEAR, YEAR_MONTH, ZEROFILL, ZONE


thanks for collecting these I got shanked by this twice in one project by using link and attribute…I was hesitant to use a prefix at first…Mylink or whatever because I thought it would confuse rails when it pluralizes class files
Try rssnewsdigest.com, a new comprehensive news aggregator. With rssnewsdigest, you don ’t really have to go anywhere else. http://rssnewsdigest.com
thanks for collecting these I got shanked by this twice in one project by using link and attribute…I was hesitant to use a prefix at first…Mylink or whatever because I thought it would confuse rails when it pluralizes class files
thanks for collecting these I got shanked by this twice in one project by using link and attribute…I was hesitant to use a prefix at first…Mylink or whatever because I thought it would confuse rails when it pluralizes class files
Good post!
Don’t forget this, and I literally figured this out a second ago:
DO NOT create columns named ‘errors’. Validation related methods will fail. All sorts of forms helpers will fail.
Haha, clearly theres something in ActiveRecord named exactly that…
10,000 years later it’s still a good post.
how much trouble I had with an order model