1

For example, let's say I have two models: Parent and Child

parent.rb

has_many :children

child.rb

belongs_to :parent

I'd like to find all parents where either parent.children.last.gender == "boy" OR parent.volunteer == "yes"

Thanks in advance.

4

1 回答 1

0

你必须有“最后一个孩子是男孩”还是“有一个孩子是男孩”才有效?这将适用于后者:

Parent.includes(:child).where("children.gender = 'boy' or parents.volunteer = 'yes'")

对于最后一个孩子是男孩:这相当于您在 SQL 中需要的东西,您可能可以使用find_by_sql它来使其工作或使用 rails 语法或 Arel 创建类似的东西。

select p.* from parents p inner join 
(select parent_id, gender from children where id in (select max(id) from children group by parent_id)) c
on c.parent_id = p.id where p.volunteer = 'Yes' OR c.gender = 'Boy';

根据您的数据库的大小,此查询的运行可能非常昂贵,替代解决方案可能是将最后一个孩子的性别存储在父记录上,并在每次添加新孩子时更新它,如果它与父母当前的性别不同。

于 2013-10-13T22:46:04.183 回答