0

Rails アプリで作成した関連付けから重複を削除する方法を説明できますか。このアプリを使用すると、ユーザーはさまざまなコースを教えたり、さまざまなコースを勉強したりできます。勉強できるコースは、教えられるコースと同じです。この質問の目的のために、教えて学ぶことができるコースが 3 つあると想像してください。science, math, english

私が現在関連付けを持っている方法は次のとおりです。Target モデル (学習可能なコースを表す) を作成し、3 つのコースをシードしscience, math, englishました。このような Course モデル (ユーザーが教えているコースを表す) も作成し、同じ 3 つのコースをシードしました。不明な場合に備えて、モデルを「ターゲット」と呼びました。これは、ユーザーが学習しようとしている主題を表すためです。

User 

has_and_belongs_to_many :targets #courses the user is studying 

has_and_belongs_to_many :courses #courses that users are teaching

したがって、不必要な重複があると思います。Course モデルと Target モデルは、まったく同じデータ (つまり、同じコース) を持ちます。(2 つの Target.rb と Course.rb の代わりに) 1 つのモデルを作成し、それを使用して、ユーザーが教えているコースと勉強しているコースの両方を表す方法はありますか?

アップデート

明確にするために、モデルが何をしているかを説明/表示するために、シードされたデータを参照しているだけです。つまり、Target.rb と Course.rb は本質的に同じであり、異なる役割を果たしているだけです。これは、ユーザーとターゲット/コースの間の将来の関係のテンプレートです。たとえば、私は科学を勉強していて、数学を教えているかもしれません。

4

2 に答える 2

1

コースがあるそうです。

class Course < ActiveRecord::Base
  attr_accessible :subject
  has_and_belongs_to_many :students
  belongs_to :teacher
end

この設計では、コースに多くの学生を登録することができ、学生は任意の数のコースに登録できます。各コースには、1 人の教師を割り当てることができます。コースには、"math" や "english" などの名前である subject と呼ばれる 1 つの (文字列) 属性があります。コース モデルを拡張して、教室数、難易度、長さなどの追加情報を含めることができます。

これにより、次のようなクエリが可能になります

alice = Student.find_by_first_name("Alice")
alice.courses.last.subject
=> "english"
alice.courses.last.teacher.first_name
=> "Eric"

また

eric = Teacher.find_by_first_name("Eric")
eric.courses.where(subject: 'math').count
=> 3

これは、Eric が 3 つの数学のクラスを教えていることを示しています。

于 2013-08-11T01:32:43.750 に答える
0

以下の解決策。学生とコースの間で1対多の接続が必要ですか?明らかに多対多のようです。とにかく、重要なビットは 2 番目の関連付けです。

class User

  has_and_belongs_to_many :courses   #or possibly better has_many :through, your call
  has_many :taught_courses, :class_name => :course, :foreign_key => teacher_id

end

class Course
  belongs_to :teacher, :class_name => :user, :foreign_key => teacher_id
  has_and_belongs_to_many :users
end

アップデート:

上記のコードは、2 つの関連付けを作成します。最初の 1 つは habtm 関連付けです。これには、2 つの列 (course_id と user_id、id 列なし) を持つ course_users という別のテーブルが必要です。これにより、次のことが得られます。

course.users       #=> list of users taking the course

必要に応じて、この関連付けの名前を次のように変更できます。

has_and_belongs_to_many :students, :class_name => :user

2 番目の関連付けは one_to_many であるため、次の方法で使用できます。

course.teacher         #=> return single user or nil
user.taught_courses    #=> return list of courses taught by given user

別の更新:

2 つのテーブルを介した複数の habtm 関連付け (1 つのテーブルを好むこともできますが、has_many :through を使用する必要があります。この場合は、どちらにしてもおそらくより良いでしょう。スキーマ:

create_table "courses" do |t|
  t.string   "name"
  t.datetime "created_at", :null => false
  t.datetime "updated_at", :null => false
end

create_table "courses_students", :id => false do |t|
  t.integer "course_id"
  t.integer "user_id"
end

create_table "courses_teachers", :id => false do |t|
  t.integer "course_id"
  t.integer "user_id"
end

create_table "users" do |t|
  t.string   "name"
  t.datetime "created_at", :null => false
  t.datetime "updated_at", :null => false
end

モデル:

class Course < ActiveRecord::Base
  attr_accessible :name

  has_and_belongs_to_many :teachers, :class_name => "User", :join_table => :courses_teachers
  has_and_belongs_to_many :students, :class_name => "User", :join_table => :courses_students
end

class User < ActiveRecord::Base
  attr_accessible :name

  has_and_belongs_to_many :courses, :join_table => :courses_students
  has_and_belongs_to_many :taught_corses, :join_table => :courses_teachers
end
于 2013-08-11T01:27:11.017 に答える