以下の解決策。学生とコースの間で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