1


1

Rails ActiveRecordの質問

ActiveRecordを使用した単一テーブルの継承。 `@test = Employee.all`を使用して、作成されたすべての従業員を検索できるためです。 レールはどのようにこれを行いますか? ユーザーテーブルのみを使用するため。 従業員についてどのように知り、従業員のみを取得しますか? Rails Magic? 誰か説明? 前もって感謝します。

Base Class : Person (inherits ActiveRecord)
Sub-Class: Employee, Supervisor, Manager (each inherit Person)

したがって、Personテーブルには、テーブルをポリモーフィックにするために_typeフィールドと_idフィールドが必要です。

次の質問は、PersonテーブルにEmployeeを関連付ける方法と、従業員を保存するときに、person_typeフィールドのEmployeeに実際に入れる方法です。

2 回答


3


_ _ ユーザーテーブルが単一テーブル継承をサポートする必要があることをRuby on Railsに示すには、「type」という名前の列をユーザーテーブルに追加する必要があります。 ユーザーテーブルの定義は次のとおりです。

CREATE TABLE users(id INT NOT NULL AUTO_INCREMENT、user VARCHAR(15)NOT NULL UNIQUE、pass VARCHAR(40)NOT NULL、タイプVARCHAR(20)NOT NULL、PRIMARY KEY(id));

typeという名前の列には、各ユーザーに使用するクラスの名前であるクラスタイプを格納する必要があります。 特定のユーザーを管理者としてマークするには、タイプを「管理者」に設定します。 ユーザーのタイプを「管理者」に設定すると、管理者モデルクラスで定義されている完全な管理者権限がユーザーに付与されます。 _ _


2


単一のテーブルの継承では、テーブルの type`カラムを使用してオブジェクトのタイプを示します。 `ActiveRecord`は、 Employee`クラスが単一のテーブル継承を使用していることを知っています(一致するテーブルがなく、users / peopleテーブルにはtype列があります)。

したがって、 Employee.all`を要求すると、 type == 'Employee'`のusers / peopleテーブル内のすべてのエントリを検索することがわかります。

ログを見ると、これらのクエリのSQLが表示され、「魔法」が発生していることがわかります。