对不起,如果我的问题措辞不好。我很难表达得很好。让我们在代码中试一试!
我有一个拥有多个项目的客户端模型。如果我有这样生成的ActiveRecord关系;
clients = Client.where(':sign_up_time < ?', Time.now)
我希望获得属于此关系中返回的客户的所有项目的列表,我该如何处理?我可以很容易地在Ruby中完成它并获得一系列项目返回,例如
projects = clients.inject([]) {|proj,cli| proj << cli.projects}.flatten
这绝对没问题,但我认为在ActiveRecord中可能有一个很好的干净方法。
重要的是我想使用clients
对象作为我的起点。
答案 0 :(得分:3)
我相信你想要的是一个加入,阅读所有相关内容:
http://guides.rubyonrails.org/active_record_querying.html#joining-tables
Project.joins(:clients).where(:clients=>'sign_up_time < ?', Time.now)
答案 1 :(得分:2)
这不是真正的ActiveRecord,但执行以下操作有点像这样的习惯用法:
projects = Client.where(':sign_up_time < ?', Time.now).map(&:projects).flatten
这与你所拥有的几乎完全相同,但写得更清晰。不过你也可以这样做:
clients = Client.where(':sign_up_time < ?', Time.now)
projects = Project.where(:client_id => clients)
这导致projects
是ActiveRecord::Relation
而不是数组,这可能更有用。它也是一种更加面向SQL的方法,可以更快。