7

私はArelソースとRails3.0のアクティブレコードソースのいくつかを調べましたが、クエリを作成するときにArelがincludes()を使用する能力を変更するかどうかについて自分自身に良い答えを集めることができないようです、 良い方向へ。

返されるアソシエーションレコードについて、2.3.5以前のactiverecord:includeクエリの条件を変更したい場合があります。しかし、私が知る限り、これはすべての:includeクエリに対してプログラムで維持できるわけではありません。

(一部のAR-find-includes make t#{n} .c#{m}は、すべての属性の名前を変更します。これらのクエリに条件を追加して、結合されたセットの結果を制限することもできますが、他のAR-find-includesはn_joins+1番号を実行します。 IDセットに対するクエリの数が繰り返され、ARをハックしてこれらの繰り返されるクエリを編集する方法がわかりません。)

Arelでは、includes()を使用するときに、結果として関連付けられるモデルオブジェクトを指定するActiveRecordクエリを作成できますか?

元:

User :has_many posts( has_many :comments)

User.all(:include => :posts) #say I wanted the post objects to have their 
 #comment counts loaded without adding a comment_count column to `posts`.

#At the post level, one could do so by: 
posts_with_counts = Post.all(:select => 'posts.*, count(comments.id) as comment_count', 
         :joins => 'left outer join comments on comments.post_id = posts.id',
         :group_by => 'posts.id') #i believe

#But it seems impossible to do so while linking these post objects to each 
  #user as well, without running User.all() and then zippering the objects into 
  #some other collection (ugly) 
  #OR running posts.group_by(&:user) (even uglier, with the n user queries)
4

3 に答える 3

4

実際にARELをコアに使ってみませんか。実際のテーブルスコープにたどり着いたら、ActiveRecordの実装自体とは完全に異なるArel::Relationを使用できます。ActiveRecord :: Relationshipは、Arel :: Relationship&Arel :: Tableのラッパーの完全に異なる(そして破壊された)実装であると私は心から信じています。アクティブレコードスタイルであるThing.scoped.table(Arel :: Table)を実行するか、新しいArel :: Table(my推奨される方法)。これから、次のことができます。

posts = Arel::Table.new(:thing, :as => 'p') #derived relation
comments = Arel::Table.new(:comments, :as => 'c') # derived relation
posts_and_comments = posts.join(comments).on( posts[:id].eq(:comments[:id]) )

# now you can iterate through the derived relation by doing the following
posts_and_comments.each {...} # this will actually return Arel::Rows which is another story.  
#

Arel :: Rowは、Arel :: Header(Arel :: Attributesのセット)とタプルで構成されるセットからタプルのTRUE定義を返します。

また、もう少し冗長ですが、私がArelをコアとして使用する理由は、ActiveRelationの背後にある力であるリレーショナルモデルを本当に公開しているためです。ActiveRecordがArelが提供するものの20%のように公開していることに気づきました。開発者は、このNORに気付かず、関係代数の真のコアを理解しないのではないかと心配しています。条件ハッシュを使用することは、私にとって「古い学校」であり、関係代数の世界でのActiveRecordスタイルのプログラミングです。マーティンファウラーモデルベースのアプローチから脱却し、EFコッドリレーショナルモデルベースのアプローチを採用することを学ぶと、これは実際にはRDBMSが何十年も試みてきたものですが、非常に間違っています。

私は自由に、ルビーコミュニティのためにアレルと関係代数に関する7部構成の学習シリーズを開始しました。これらは、完全な初心者から、自己参照関係や作曲中の閉鎖などの高度なテクニックに至るまでの短いビデオで構成されます。最初のビデオはhttp://Innovative-Studios.com/#pilot にあります。さらに情報が必要な場合、またはこれが十分に説明的ではなかった場合は、お知らせください。

アレルの未来は明るく見えます。

于 2010-05-20T22:24:37.617 に答える
3

ActiveRecord :: RelationshipはBase#find_by_sqlのかなり弱いラッパーであるため、:includeクエリはインクルードによって拡張されることはありません。

于 2010-05-31T19:25:20.407 に答える
1

そうじゃない

Post.includes([:author, :comments]).where(['comments.approved = ?', true]).all

あなたが探しているものは?(公式ドキュメントから取得)

于 2011-02-06T21:12:42.743 に答える