1

我正在开发一个应用程序的一部分,该应用程序将根据父母的其他孩子的属性对孩子的列表进行排序。

以下是我正在使用的课程:

class SpecialChild
  belongs_to: Parent

class Child_A
  belongs_to: Parent

class Child_B
  belongs_to: Parent

class Parent
  has_many: SpecialChild
  has_many: Child_A
  has_one: Child_B

这些是应用于它的两个订单函数:

scope :order_child_a,
  joins("INNER JOIN child_a ON specialchild.parent_id = child_a.parent_id").
  where("booleanvalue = true")

scope :order_parent_and_child_b,
  joins("LEFT OUTER JOIN parent ON specialchild.parent_id = parent.id").
  joins("LEFT OUTER JOIN child_b AS name ON parent.child_b_id = child_b.id").
  order("name ASC, parent.lastname ASC")

我的问题是,即使这个列表中只有一个 SpecialChild,但它的父级有多个具有 booleanvalue = true 的 Child_A,所以即使它不存在,我也会显示同一个 SpecialChild 的副本。

编辑:虽然我包含了第二个范围,但问题出现在第一个范围内,因为由于缺少预期信息,我无法在不遇到更多错误的情况下执行 .uniq。我还想避免修改 order_parent_and_child_b,因为它在整个应用程序中都使用。

4

2 回答 2

0

愚蠢的我忘记了 SQL 是如何工作的。需要清楚地选择您订购的任何东西。所以我需要在第二种方法scope :order_parent_and_child_b之后编辑右边。joins()

scope :order_parent_and_child_b,
  joins("LEFT OUTER JOIN parent ON specialchild.parent_id = parent.id").
  joins("LEFT OUTER JOIN child_b AS name ON parent.child_b_id = child_b.id").
  select("specialchild.*, name.name, parent.lastname").
  order("name.name ASC, parent.lastname ASC")
于 2013-08-08T17:13:09.010 回答
0

我不知道我是否理解正确,但也许你可以通过简单地在 where 子句中指定表的名称来避免这个问题,如下所示:

scope :order_child_a,
  joins("INNER JOIN child_a ON specialchild.parent_id = child_a.parent_id").
  where("specialchild.booleanvalue = true")
于 2013-08-07T21:01:44.290 回答