3

私はこれに対する決定的な答えを見つけるのがどれほど難しいかに驚いています:それは私がそれをすべて間違って見ているに違いないほど一般的であるように思われます。

承認の役割を持つユーザーには、ROLES =%w[管理者モデレーター教師の学生の禁止]のようなものが実行されます。

一般に、ROLESフィールドと単一テーブル継承を使用することをお勧めします(ここのように)

class User < ActiveRecord::Base
end

class Student < User
end

class Teacher < User
end

ただし、これによりすべてのデータが1つのテーブルに配置されます。各ユーザータイプに固有の大量のデータがある場合はどうなりますか?

student
  year:integer
  request_id:integer
  portfolio_id:integer
  status:string
  ...

teachers
  user_id:integer
  district:string
  school:string
  subject1:string
  subject2:string
  specialty:string
  bio:text
  ...

STIは、student.specialtyやteacher.portfolio_idのようなものを提供しますが、これらは不要であり、ブロックする必要があります。

Ruby Wayは、個別のテーブルを処理するための抽象基本モデルクラスを提案しています。

class User < ActiveRecord::Base
  self.abstract = true
end

class Student < User
end

class Teacher < User
end

これにより、生徒と教師の両方に固有のテーブルが許可されます。ただし、User.find(:all)は機能しないと警告しています。さらに、必要な共通の属性があります。これは、ユーザーモデルの要点でした。

User
  username:string
  email:string
  password:string
  role:string

Userテーブルがないので、共通の属性はありませんか?

他のさまざまな回答は、、、またはを使用することを示唆して:polymorphic => true:class_name => 'User'ますas:が、投稿と画像の両方にコメントを追加するように説明されています。これは良い類似点ではないようです。

単にIS-A関係を使用して属性を継承した少なくとも1つの言語(およびおそらく2つのOODB)を思い出しているようです。

RAILSの方法は何ですか?

4

1 に答える 1

0

ここでSTIを行うのは間違っていると思います。1つのテーブルに押し込まれるようなことが多すぎます。

私はむしろ一般的なユーザーモデルを作成し、電子メール、名前などの一般的なものを保持し、ユーザータイプごとに個別のモデル(およびテーブル)を用意します。したがって、教師と生徒はユーザーを参照しますが、独自のフィールドがあります。

ロールは、ユーザーとは別の独自のテーブルにも存在する必要があります。

次のようにユーザーレコードを参照します。

class Teacher < AR::Base
  belongs_to :user
end
class Student < AR::Base
  belongs_to :user
end
class User < AR::Base
  has_one :teacher
  has_one :student
end
于 2012-01-25T17:18:35.000 に答える