2012-05-04 5 views
0

申し訳ありませんが、私の質問に言葉が貧弱です。私はそれをうまく表現するのに苦労しています。コードで試してみましょう!activerecordリレーションを使用してネストされた属性を見つけることはできますか?

私はhas_manyプロジェクトのクライアントモデルを持っています。私がActiveRecord関係を生成したような場合、

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

と私はクライアントに属するすべてのプロジェクトのリストを取得したいが、この関係で返され、私はそれについてどのように行きますか?私はRubyで簡単にやりとりでき、返されたプロジェクトの配列を取得することができます。

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

これは絶対に問題ありませんが、私はActiveRecordでこれを行うきれいな方法があると思いました。

重要なことは、clientsオブジェクトを私の出発点として使用したいということです。

答えて

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指向のアプローチでもあり、高速化が可能です。

+0

、と私は2番目のバージョンのうち、ActiveRecordの::関係を得るように行います。私はそれが私が何とかしていると思う。ありがとう。 – brad

2

私はそれについてのすべてを読んで、何をしたいが参加していると信じて:少なくともRubyのクリーナーですそれ

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

Project.joins(:clients).where(:clients=>'sign_up_time < ?', Time.now) 
+1

ありがとう、それは私が思うが、私の既存のクライアントオブジェクトを使用することはできません。 – brad

関連する問題