2016年12月29日に投稿

[Rails] self.abstract_class = true の意味と挙動

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

app/models/dog.rb

この状態で、Rails Console を起動して dog = Dog.new を行うと、ActiveRecord::StatementInvalid: Could not find table 'animals' というエラーが表示されます。これはデータベースに animals というテーブルが見つからないためです。

そのため、クラス Animal に self.abstract_class = true を追加します。

app/models/animal.rb

app/models/dog.rb

この状態で、Rails Console を起動して dog = Dog.new を行うとエラーが出ません。

参考
http://api.rubyonrails.org/classes/ActiveRecord/Inheritance/ClassMethods.html

関連記事

Leave a Reply