QA@IT

ActiveRecordで避けるべきモデル名は?

5403 PV

モデル名として明らかにまずそうな名前を使おうとすると、ジェネレータで以下のようにエラーが出ます。

$ rails g scaffold symbol name
      invoke  active_record
The name 'Symbol' is either already used in your application or reserved by Ruby on Rails. Please choose an alternative and run this generator again.

エラーは出ないものの使ってはいけない名前というのはあるでしょうか? Recordモデルを作ろうとして直感的にマズイのじゃないかと思ったのですが、

$ rails g scaffold record name
      invoke  active_record
      create    db/migrate/20120625121415_create_records.rb
      create    app/models/record.rb
      invoke    test_unit
      :
      :

と、問題なく使えそうにも見えます。が、そもそもジェネレータのエラーを信じられるようにも思えません。

言語の予約語のように、どこかにRuby on Railsで避けるべき名前一覧のようなものがあれば、教えていただけませんでしょうか。

回答

https://github.com/rails/rails/blob/master/railties/lib/rails/generators/base.rb#L249

どう判定しているかという話になりますがこの辺でしょうか。
既に Ruby レベルで定義されているかという感じみたいですね。

Ruby 本体, Rails のドキュメントに乗っているクラス名は基本的に使えない物と思ってよさそうです。

(ところで間違えてこっち にここに書く予定の回答を post しちゃったんだけど消せないのかな)

編集 履歴 (0)
  • Ruby、Railsのクラス名の衝突はダメと。でも例えば、actionモデルは衝突しないけど、使えない(使うと、すぐにあちこちエラーが起こる)みたいなのがあって、それってどういうリストになるのかな、というのが気になったのでしたした。古いリストは http://oldwiki.rubyonrails.org/rails/pages/ReservedWords にあるんですけどね -

sorahさんの指摘を参考に、Ruby 1.9.3、Rails 3.2.6のコンソールでObjectに定義されている定数を見てみました。一部をのぞいて、まさか使うことはないでしょうけど。

> Object.constants
 => [:Object, :Module, :Class, :BasicObject, :Kernel, :NilClass, :NIL, :Data, :TrueClass, :TRUE, :FalseClass, :FALSE, :Encoding, :Comparable, :Enumerable, :String, :Symbol, :Exception, :SystemExit, :SignalException, :Interrupt, :StandardError, :TypeError, :ArgumentError, :IndexError, :KeyError, :RangeError, :ScriptError, :SyntaxError, :LoadError, :NotImplementedError, :NameError, :NoMethodError, :RuntimeError, :SecurityError, :NoMemoryError, :EncodingError, :SystemCallError, :Errno, :ZeroDivisionError, :FloatDomainError, :Numeric, :Integer, :Fixnum, :Float, :Bignum, :Array, :Hash, :ENV, :Struct, :RegexpError, :Regexp, :MatchData, :Marshal, :Range, :IOError, :EOFError, :IO, :STDIN, :STDOUT, :STDERR, :ARGF, :FileTest, :File, :Dir, :Time, :Random, :Signal, :Process, :Proc, :LocalJumpError, :SystemStackError, :Method, :UnboundMethod, :Binding, :Math, :GC, :ObjectSpace, :Enumerator, :StopIteration, :RubyVM, :Thread, :TOPLEVEL_BINDING, :ThreadGroup, :Mutex, :ThreadError, :Fiber, :FiberError, :Rational, :Complex, :RUBY_VERSION, :RUBY_RELEASE_DATE, :RUBY_PLATFORM, :RUBY_PATCHLEVEL, :RUBY_REVISION, :RUBY_DESCRIPTION, :RUBY_COPYRIGHT, :RUBY_ENGINE, :ARGV, :Gem, :RbConfig, :Config, :CROSS_COMPILING, :Pathname, :Bundler, :Etc, :Date, :Psych, :StringIO, :StringScanner, :ScanError, :DateTime, :Syck, :YAML, :FileUtils, :Digest, :Set, :SortedSet, :URI, :Zlib, :OptionParser, :TSort, :Forwardable, :SingleForwardable, :APP_PATH, :Exception2MessageMapper, :IRB, :RubyToken, :RubyLex, :Readline, :Rails, :OpenSSL, :Fcntl, :SecureRandom, :ActiveSupport, :Logger, :ConditionVariable, :Queue, :SizedQueue, :MonitorMixin, :Monitor, :I18n, :Base64, :ActionPack, :ActiveModel, :Rack, :ActionDispatch, :Arel, :BigDecimal, :BigMath, :ActiveRecord, :Benchmark, :REXML, :AbstractController, :ActionController, :ActionView, :ERB, :HTML, :MissingSourceFile, :ActionMailer, :ActiveResource, :Sprockets, :SQLite3, :Sass, :ExecJS, :Shellwords, :Delegator, :SimpleDelegator, :Tempfile, :MultiJson, :CoffeeScript, :Coffee, :Uglifier, :Jquery, :QualifiedConstUtils, :Journey, :Racc, :ParseError, :HashWithIndifferentAccess, :JSON, :OpenStruct, :RAILS_CACHE, :SASS_BEGUN_TO_LOAD, :Tilt, :TZInfo, :Hike, :Mime, :PrettyPrint, :PP, :MiniTest, :Test, :Mocha, :Singleton]

情報は古いですが、http://oldwiki.rubyonrails.org/rails/pages/ReservedWords も参考になります。クラス名の衝突だけじゃなくて、action とか link とか色々とまずそうな感じのものが挙げられています。

編集 履歴 (1)
  • 後から Rails で既存の名前使われたらどうすんだろと思った -
  • すでにユーザーが定義済みのモデル名を後からRailsが使って不幸が起こる例は実際に過去にあったみたいで、体験談を読んだことがあります。まあモデル名を変えればいいってことなんでしょうけど。 -
  • typeがダメってのはよく悩みますね…、kindとかklassとかで逃げてるんですがいい名前誰か知りませんか -
  • typeはほんと困りますねぇ、わたしもkindで逃げる派ですがもっといい命名が欲しい。 -
ウォッチ

この質問への回答やコメントをメールでお知らせします。