0

ユーザー認証にDeviseを使用するRailsアプリ。簡単に始めて、今ではかなり複雑になっています。

サイトにログインするユーザーには、管理者、教師、保護者の 3 種類があります。私はこれらのための 1 つの DeviseUserモデルとUser.role文字列を持っています。Studentモデル(ログインしない)とモデルがありLessonます。

これらは私が必要とする関係です:

  • レッスンは 1 人の生徒に属します
  • 学生は多くのレッスンを持っています
  • 学生には多くの教師がいます
  • 生徒は 1 人の保護者に属します
  • 親には多くの生徒がいます
  • 先生にはたくさんの生徒がいます

サイトの基本機能: 教師はログインして、生徒のためにレッスンを作成します。保護者の方はログインして、お子様 (生徒) のすべてのレッスンをご覧ください。管理者はログインして、教師、保護者、生徒を CRUD できます。

私はそれのほとんどを機能させましたが、「学生には多くの教師がいます」と「親には多くの学生がいます」を実装しようとしたときに困惑しました。私の最初の (間違った) 仮定は、生徒には教師が 1 人だけいて、親には学校に 1 人の子供しかいないというものでした。

そのため、これらの関係には文字列を使用するUser.roleだけでは十分ではないようです。

アドバイスや一般的な概念は大歓迎です。

4

3 に答える 3

0

結合テーブル、つまり has_and_belongs_to_many 関係を探しているだけですか?

http://guides.rubyonrails.org/association_basics.html#the-has-and-belongs-to-many-association

私の考えでは:

class Student
  belongs_to :parent
  has_and_belongs_to_many :teachers
end

class Parent
  has_many :students
end

class Teacher
  has_and_belongs_to_many :students
end
于 2013-08-14T21:27:55.593 に答える
0

最終的に 3 番目のモデルを作成し、has_many :through =>すべてをリンクするために使用しました。単一の Devise ユーザー モデルを保持し、承認に を使用したかったの.roleです。

私が作成した 3 番目のモデルはTimeslotで、基本的に教師と生徒が対話する場所です。class理想的にはorと呼んでsessionいましたが、どちらも予約語です。

# timeslot.rb
class Timeslot < ActiveRecord::Base
  belongs_to :user
  belongs_to :student
end

# user.rb
class User < ActiveRecord::Base
  ROLES = %w[admin teacher parent]
  has_many :timeslots
  has_many :students, through: :timeslots
end

# student.rb
class Student < ActiveRecord::Base
  has_many :lessons
  has_many :timeslots
  has_many :users, through: :timeslots
end

これにより、ロールを持つユーザーteacherは多くのロールを持つことができ、studentsその逆も可能です。Studentモデルには、role を持つユーザーのをparent_id格納する列があります。その部分はまだ少し不格好ですが、今のところ問題なく動作しています。アプリをスケーリングする必要がある場合は、より洗練されたものにリファクタリングする必要があると確信しています。idparent

于 2013-08-18T09:45:45.223 に答える