1

私は最近、このブログ投稿に出くわしました。このブログ投稿では、Array#uniqはActiveRecordオブジェクトの配列で異なる動作をするが、具体的な例は示されておらず、その理由も示されていません。

この異なる振る舞いの再現可能な例とその説明を見てみたいと思います。

編集: 私はActiveRecord :: Relationship#uniqではなくArray#uniqについて話している。後者が上記のブログ投稿が実際に意味するものである場合、私の質問はすでにlozによって回答されています(以下を参照)。

4

1 に答える 1

1

アクティブ レコードの「配列」は配列ではなく、異なるものです。そのため (明示的に配列を返す .all は別として) 関連付けなどを使用すると、遅延読み込みが動作しているため、異なる動作が得られます。

post = Post.find(1)
post.comments
=> Array[Comment(:1), Comment(:2)]... etc

配列のように見えますが、

post.comments.class
=> ActiveRecord::Relation

そのため、Uniq を実行するとリレーションシップが操作され、レコードが必要になったときに最終的にデータベースで実行されるクエリにさらに制約が追加されます。

post.comments.uniq

これにより、ruby で uniq を実行するのではなく、SQL で DISTINCT または UNIQUE クエリ句を実行して uniq を実行します。

Uniq の詳細はここにあります: rails uniq documentation 。アクティブ レコードでActiveRecord::Relation を返すものについては、ここで確認できます。

于 2013-01-09T08:10:58.370 に答える