ActiveRecord::Base を継承したクラスをモデルとして作成すると、Rails はそのクラス名に対応したデータベースのテーブルを自動的に探そうとします。対応するデータベースのテーブルを用意しない場合は、self.abstract_class = true
を書く必要があります。ActiveRecord::Base を継承したクラスを作成し、さらにそのクラスを継承させたい場合に self.abstract_class = true
が書かれるようです。
実際に Rails 5.0.1 にて検証しました。例えば、app/models 以下に ActiveRecord::Base
を継承したクラス Animal を作ります。そしてクラス Animal を継承したクラス Dog を作ります。そしてデータベースには dogs というテーブルを作成します。
app/models/animal.rb
1 2 3 |
class Animal < ActiveRecord::Base end |
app/models/dog.rb
1 2 3 |
class Dog < Animal end |
この状態で、Rails Console を起動して dog = Dog.new
を行うと、ActiveRecord::StatementInvalid: Could not find table 'animals'
というエラーが表示されます。これはデータベースに animals というテーブルが見つからないためです。
そのため、クラス Animal に self.abstract_class = true
を追加します。
app/models/animal.rb
1 2 3 4 |
class Animal < ActiveRecord::Base self.abstract_class = true end |
app/models/dog.rb
1 2 3 |
class Dog < Animal end |
この状態で、Rails Console を起動して dog = Dog.new
を行うとエラーが出ません。
参考
http://api.rubyonrails.org/classes/ActiveRecord/Inheritance/ClassMethods.html
[…] [Rails] self.abstract_class = true の意味と挙動 « Codaholic 参考: Active Record で複数のデータベース利用 - […]