【问题标题】:has_many through in Ruby on Rails apphas_many 通过 Ruby on Rails 应用程序
【发布时间】:2012-06-20 02:40:45
【问题描述】:

在我的 rails 应用中,用户可以创建课程和学校(组)。每次用户创建课程或学校时,他们的 user_id 都会存储在课程或学校的数据库表中,因此用户 has_many :schools 和 :courses 以及学校或课程 belongs_to :user。此外,用户可以通过关系模型使用 has_many 参加课程和加入学校(作为学生或教授)(对于具有 :user_id、school_id 和 :role [string] 的学校的学校组,以及对于课程 student_users(和professor_users)它有一个:user_id、course_id 和:role [string]。我的问题是,在用户模型中我可以只指定一次:

has_many :schools, :dependent => :destroy
has_many :courses, :dependent => :destroy
has_many :schoolgroups, :dependent => :destroy
has_many :student_users, :dependent => :destroy
has_many :professor_users, :dependent => :destroy

或者我是否必须有一个看起来像这样的用户模型:

has_many :schools, :dependent => :destroy
has_many :courses, :dependent => :destroy
has_many :schoolgroups, :dependent => :destroy
has_many :schools, :through => :schoolgroups
has_many :student_users, :dependent => :destroy
has_many :courses, :through => :student_users
has_many :professor_users, :dependent => :destroy
has_many :courses, :through => :professor_users

【问题讨论】:

  • 您不能指定多个具有相同名称的关联 (courses)。不过,不确定这是否是您想要的?
  • 是的,我想我应该做的是更改两个关系表中“课程”和“学校”id字段的名称,然后指定一个外键

标签: ruby-on-rails ruby ruby-on-rails-3


【解决方案1】:

您需要更详细地考虑模型的所有权。 has_many 表示多对一的关系,所以说Professor has_many Courses 表示教授拥有课程并且课程只有一位教授(或者是吗?)。所以你会做这样的事情:

has_many :school, :dependent => :destroy
has_many :courses, :dependent => :destroy
has_many :schoolgroups, :dependent => :destroy

另一方面,您将拥有与该用户相关联的事物,但其他用户也可能以相同的方式关联。例如,用户可以是课程中的学生,但许多其他学生也可以。为此,您需要使用代表多对多关系的has_and_belongs_to_many 或HABTM:

has_and_belongs_to_many :courses_as_student, :class_name => "Course",
                                             :join_table => "student_users"

然后在Course 类中:

belongs_to :user

# or even better:
# belongs_to :professor, :class_name => "User", :foreign_key => "professor_id"

has_and_belongs_to_many :students, :class_name => "User",
                                   :join_table => "student_users"

您可以阅读Rails documentation中的所有详细信息。

【讨论】:

    猜你喜欢
    • 2012-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-14
    • 1970-01-01
    • 2011-09-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多