【问题标题】:belongs_to and has_many of the same itemsbelongs_to 和 has_many 相同的项目
【发布时间】:2012-12-20 18:07:28
【问题描述】:

我正在建模一个课程表,课程属于用户,即课程的老师和创建者,而且课程可以有很多学生,他们也是用户。

所以应该是这样的

class Lesson < ActiveRecord::Base
  belongs_to :user
  has_many :users
end

我想打电话给第一个用户teacher,以及用户集合students,我已经阅读了http://guides.rubyonrails.org/association_basics.html 的文档,但我不能完全找到我想要的。

【问题讨论】:

    标签: activerecord


    【解决方案1】:

    这应该有你想要的:http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html#method-i-belongs_to

    我想你想要class_name 选项:

    class Lesson < ActiveRecord::Base
      belongs_to :teacher, class_name: "User"
      has_many :students, class_name: "User"
    end
    

    【讨论】:

    • 哦,哎呀,我写的是belongs_to而不是has_many。是的,它具有相同的 class_name 选项,因此它的工作方式相同。
    • 看看上面的链接,第 2.10 节:上面示例中的名称“下属”和“经理”(分别为“老师”和“学生”)是 User 类的别名,所以是的,has_many 会起作用。
    【解决方案2】:

    在您当前的代码中,所有用户都可以是课程的“所有者”(教师),而您应该有两个额外的类“学生”和“教师”,它们都与“用户”类具有 1:1 的关系.

    这样更合适:

    class Teacher < ActiveRecord::Base
      has_one :user
    end
    
    class Student < ActiveRecord::Base
      has_one :user
    end
    
    class Lesson < ActiveRecord::Base
      belongs_to :teacher
      has_many :students
    end
    

    【讨论】:

    • 但是学生可以成为老师,反之亦然,所有用户都可以创建课程并学习其他用户的课程
    • 在这种情况下,学生会将其班级更改为“教师”,反之亦然,用户实例将持续存在,关联将更改。如果您不需要预过滤,我会坚持 Jeremy Ruten 的解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-07
    • 2023-03-21
    • 2023-03-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多