我正在处理一个应用程序的一部分,该应用程序将根据父级的其他子级属性对子级列表进行排序。
以下是我正在使用的课程:
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,但它的Parent有多个具有booleanvalue = true的Child_A,所以即使它不存在,我也会得到同一个SpecialChild的副本。
编辑: 问题出现在第一个范围,虽然我包括第二个范围,因为我不能做.uniq而不会因为缺少预期信息而遇到更多错误。我还想避免修改order_parent_and_child_b,因为它在整个应用程序中使用。
答案 0 :(得分:0)
我不知道我是否理解正确,但也许您可以通过在where子句中指定表的名称来避免此问题,如下所示:
scope :order_child_a,
joins("INNER JOIN child_a ON specialchild.parent_id = child_a.parent_id").
where("specialchild.booleanvalue = true")
答案 1 :(得分: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")