例如,假设我有两个模型:Parent
和Child
parent.rb
has_many :children
child.rb
belongs_to :parent
我想找到所有父母parent.children.last.gender == "boy"
或parent.volunteer == "yes"
提前致谢。
答案 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';
根据数据库的大小,此查询的运行成本可能非常高,替代解决方案可能是将最后一个子项性别存储在父记录中,并在每次添加新子项时更新它,如果它与父项不同的性别目前已经。