按最后一个孩子的属性查找对象

时间:2013-10-13 22:35:07

标签: ruby-on-rails ruby-on-rails-3

例如,假设我有两个模型:ParentChild

parent.rb

has_many :children

child.rb

belongs_to :parent

我想找到所有父母parent.children.last.gender == "boy"parent.volunteer == "yes"

提前致谢。

1 个答案:

答案 0 :(得分: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';

根据数据库的大小,此查询的运行成本可能非常高,替代解决方案可能是将最后一个子项性别存储在父记录中,并在每次添加新子项时更新它,如果它与父项不同的性别目前已经。