0

私の質問の表現が不十分でしたら申し訳ありません。うまく表現できなくて困っています。コードで試してみましょう!

has_many プロジェクトのクライアント モデルがあります。そのように生成された 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)

これにより、配列でprojectsActiveRecord::Relationなく、より便利になる可能性があります。これは、より高速な SQL 指向のアプローチでもあります。

于 2012-05-04T02:04:05.183 に答える