【发布时间】:2018-07-06 11:20:19
【问题描述】:
我为这个人为的例子道歉
一个person 有一个journey,但不直接连接到journey,而是通过house 和office 连接。
一个person belongs_to a house,一个house has_many people
一个person belongs_to a office,一个office has_many people
一个journey belongs_to a house,一个house has many journeys
一个journey belongs_to a office,一个office has many journeys
+---------+
+---Belongs-To----> <----Belongs-To--+
| | House | |
| +-Has-Many-----+ +-----Has-Many-+ |
| | +---------+ | |
| | | |
+------+--v+ +v-+--------+
| | | |
| Person | | Journey |
| | | |
+------+--^+ +^-+--------+
| | | |
| | +----------+ | |
| +-Has-Many-----+ +----Has-Many-+ |
| | Office | |
+----Belongs-To---> <---Belongs-To--+
+----------+
按照那个人为的例子,允许以下内容的最佳方法是什么:
person.journey
或使用带有多个表的 Join 查询(使用 ruby 哈希)或使用带有额外表约束的 has_one_through。
我们确实有一个 sql 查询,但如果可以,我们宁愿避免使用原始 sql,但它看起来像这样:
Person
.joins('INNER JOIN journeys
ON journeys.office_id = person.office_id
AND journeys.house_id = person.house_id')
【问题讨论】:
-
一个
person属于一个office,而office有很多journeys。所以,在我看来,person可以有多个journeys。它不应该是person.journey,而更像是person.journeys。甚至通过house的关联也证实了这一点。 -
当通过
office或house完成时,你是对的,但是当通过这两个完成时,每个person只有一个journey。
标签: sql ruby postgresql activerecord ruby-on-rails-5.1