【问题标题】:Ruby on Rails: Model Association with multiple foreign keysRuby on Rails:具有多个外键的模型关联
【发布时间】:2013-01-18 03:31:20
【问题描述】:

我正在开发一个User 模型,每个用户应该能够同时拥有学生和老师。但是,由于 studentteacher 都是 User 的类型,所以我的模型有点复杂。

这就是我现在正在尝试的。

Teacher_student_link

class TeacherStudentLink < ActiveRecord::Base
  attr_accessible :student_id, :teacher_id, :user_id

  belongs_to :user
  belongs_to :teacher, :class_name => "User"
  belongs_to :student, :class_name => "User"
end

用户

class User < ActiveRecord::Base
  has_many :teacher_student_links, :foreign_key => { :student_id, :teacher_id }, :dependent => :destroy
  has_many :students, :through => :teacher_student_links
  has_many :teachers, :through => :teacher_student_links
end

如果一切都如我所愿,我应该能够做到

@user = User.new
@user.students
@user.teachers
@user.student.teachers

我认为上面唯一的问题是我不能同时给teacher_student_link 两个外键,但我不确定。作为一种解决方法,我的模型中还没有teacher_id,只是通过student.user 调用teacher。谁能帮我解决这个问题?

更新: 使用下面的解决方案,我应该如何创建新链接?

def become_student
  @user = user.find(params[:id])
  @student_link = @user.student_links.create(:student_id => current_user.id)
  @teacher_link = current_user.teacher_links.create(:teacher_id => @user.id)
end

如果我这样做,学生和老师是否正确配对? 我有点困惑,因为在 TeacherStudentLink 中,有userstudentteacher,我不知道如何处理创建链接。

【问题讨论】:

    标签: ruby-on-rails database model-associations rails-activerecord


    【解决方案1】:

    您应该将teacher_student_links 关联分成两个关联:

      has_many :teacher_links, :foreign_key => :student_id, :dependent => :destroy, :class_name => "TeacherStudentLink"
      has_many :student_links, :foreign_key => :teacher_id, :dependent => :destroy, :class_name => "TeacherStudentLink"
      has_many :students, :through => :student_links
      has_many :teachers, :through => :teacher_links
    

    您可能还需要将外键添加到 TeacherStudentLink 上的 belongs_to 关联

    更新:

    关于您关于创建链接的第二个问题,以下应该可行:

    @user = User.find(params[:id])
    @user.students << current_user
    

    TeacherStudentLink 应该是自动创建的,如果一切设置正确,您的关联应该可以正常工作。

    【讨论】:

    • 太棒了!像魅力一样工作。
    • 太好了,很高兴能帮上忙。 :)
    • 等等,我还有一个问题。当我想创建一个链接时,我很困惑我必须做什么。你能检查我的更新吗?
    猜你喜欢
    • 2012-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多