0

抱歉,如果我的问题措辞不当。我正在努力表达它。让我们在代码中尝试一下!

我有一个拥有多个项目的客户模型。如果我有这样生成的 ActiveRecord 关系;

clients = Client.where(':sign_up_time < ?', Time.now)

我想获得一份属于在这种关系中返回的客户的所有项目的列表,我该怎么做?我可以很容易地在 Ruby 中完成它并返回一系列项目,例如

projects = clients.inject([]) {|proj,cli| proj << cli.projects}.flatten

这绝对没问题,但我认为在 ActiveRecord 中可能有一种很好的干净方法。

重要的是我想以clients对象为起点。

4

2 回答 2

3

我相信您想要的是加入,请阅读所有相关信息:

http://guides.rubyonrails.org/active_record_querying.html#joining-tables

Project.joins(:clients).where(:clients=>'sign_up_time < ?', Time.now)
于 2012-05-04T02:09:26.570 回答
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 的方法,可以更快。

于 2012-05-04T02:04:05.183 回答