0

我想知道,为什么在使用 :through 时,我总是必须在两个有问题的模型中指定 has_many :assignments 关联?这是干的吗?是否存在不需要指定它们的情况,或者它们不同的情况?谢谢你的解释。

class Programmer < ActiveRecord::Base
  has_many :projects, :through => :assignments
  has_many :assignments # Why that?
end

class Project < ActiveRecord::Base
  has_many :programmers, :through => :assignments
  has_many :assignments # Why that?
end

class Assignment < ActiveRecord::Base
  belongs_to :project
  belongs_to :programmer
end

更新

似乎我说的还不够清楚has_many :through!所以对这一点给出的答案并不真正适合我的问题。再说一遍:

为什么has_many :assignments我已经有 a 时总是需要 a has_many :projects, :through => :assignmentsRails 不应该has_many :assignments自动添加自己吗?

4

3 回答 3

3

我认为理解以下内容很重要:

和之间存在多对多关系。为了解决这种关系,您添加了一个名为的连接模型ProgrammerProjectAssignment

实际上,该表projects没有链接到programmers,而是都连接到assignments了。

你可以有这样的东西:

class Programmer < ActiveRecord::Base
  has_many :assignments
end

class Project < ActiveRecord::Base
  has_many :assignments
end

class Assignment < ActiveRecord::Base
  belongs_to :project
  belongs_to :programmer
end

但是,您不希望assignments每次要查找与程序员相关的所有项目时都访问该表。为了促进这种连接,您可以在Programmer和之间创建直接链接Project。所以,你可以这么说a programmer has many projects through the table assignments

结果是您当前的设置。例如,如果没有此配置,您将无法做到。

#find a programmer
@programmer = Programmer(1)  
#find all projects related to this programmer
@projects = @programmer.projects

在上面的示例中,您甚至不需要记住它们assignments之间有一个表。

看看这里: http: //guides.rubyonrails.org/association_basics.html#the-has_many-through-association

我希望它有帮助...

编辑

我已经包含了一个图表,所以你可以想象我想要解释的内容。

和没有直接联系ProjectProgrammer因此,has_many :projects, :through => :assignmentsRails 的一项功能可以帮助您进行思考。不,它不会取代has_many :assignments,这是与 table 的真正连接assignments

此外,该:through =>功能也可以在其他情况下使用。

在此处输入图像描述

于 2012-07-10T12:27:23.747 回答
0

如果您希望能够从程序员和项目实例访问分配(并且它有有用的数据),那么是的,您必须在每个实例中包含该关联。

但是,这不是必需的 - 因此,如果您不需要访问分配并且它实际上只是一个连接表,那么将其排除在外。

于 2012-07-10T11:58:52.460 回答
0

有许多 x 到 x 线定义了它自己的关系。在您的情况下,它告诉程序员模型程序员有很多项目,并且可以通过查看分配模型来了解这种关系。但是,这并没有指定与分配模型本身的关系。因此,为什么第二行是必要的。

于 2012-07-10T11:54:38.090 回答