【问题标题】:In Rails, what do keywords belongs_to, has_many, etc, actually do?在 Rails 中,关键字 belongs_to、has_many 等实际上是做什么的?
【发布时间】:2013-12-23 04:07:42
【问题描述】:

我了解关系数据库、主键/外键等的概念,但是,我无法看到在我的模型中设置这些属性的实际结果。他们会生成辅助函数或类似的东西吗?还是他们只是在数据库级别上工作?

例如,如果我有这两个模型(其他属性省略)

class Course < ActiveRecord::Base
  has_and_belongs_to_many :schedules
  has_many :sections
end

class Section < ActiveRecord::Base
  belongs_to :course
end

我可以像这样简单地获取任何给定课程的所有部分:

Section.where(course_id: 1234)

但是,我可以在完全不建立关系的情况下执行此操作。 所以我的问题是:我们为什么要这样做?

【问题讨论】:

  • 所以你可以得到 course.sections 代替。
  • 它们是元编程糖魔法的东西。基本上,Rails 允许您对与模型关联相关的模型使用各种其他实例方法,只需编写 belongs_to :course
  • 谢谢大家!之前,我手动定义了像@course.sections 这样的方法,即使它们已经由关系生成了:)

标签: ruby-on-rails ruby database-relations


【解决方案1】:

添加这些方法可以让你做这样的事情:

Section.find(5).course  # <== returns a 'Course' model instance

还可以让您更轻松地加入查询:

Section.joins(:course).where(course: {name: "English"})  # <== returns sections who have the 'english' course

如果您没有在模型中设置关系,这些都不可能发生。

同样:

Course.find(8).sections # returns an array of sections with 'course_id = 8'

它使您的调用更加语义化,并从编程的角度使事情变得更容易:)

【讨论】:

  • 它还处理数据库方面的问题,根据需要设置键和连接表。
  • 嗯。在模型中定义has_many 本身不会对数据库做任何事情。您仍然需要在那里进行迁移,以在 sections 表上创建 course_id 外键 - 对于任何连接表也是如此。我想如果您使用其中一个模型生成器来执行此操作,您可能会免费获得它,但我从未尝试让其中一个生成器自动为我设置关联。我最常用的是创建初始属性集。
  • 是的,你当然需要迁移才能接触数据库——guides.rubyonrails.org/association_basics.html
【解决方案2】:

关系应用于对象的实例。因此,这些关系允许您将相关对象获取到另一个实例

例如,假设您有一个Section 的实例(称为@section)。您可以通过以下方式获取该部分的所有 Course 对象:

@section.course 如果您设置了belongs_to :course

同样,如果您有一个Course 的实例,您可以通过以下方式获取该Course 的所有Section 对象:

@course.sections 如果你有has_many :sections

TL;DR - 这些是辅助作用域,例如CourseSection 的实例变量。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-08-21
    • 1970-01-01
    • 1970-01-01
    • 2015-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-30
    相关资源
    最近更新 更多